在R中压缩/合并表格中的单元格
我想在R区的桌子上做点什么 表是这样进入脚本的在R中压缩/合并表格中的单元格,r,split,R,Split,我想在R区的桌子上做点什么 表是这样进入脚本的 M P Position1 34 56 Position2 45 23 Position3 89 78 Position1 56 45 Position3 54 35 Position2 56 89 在分析这个脚本之后,理想情况下,我希望最终的输出是: M P Position1 90 101 Position2 101 102 Position3 143 113 基本上,我将M和p
M P
Position1 34 56
Position2 45 23
Position3 89 78
Position1 56 45
Position3 54 35
Position2 56 89
在分析这个脚本之后,理想情况下,我希望最终的输出是:
M P
Position1 90 101
Position2 101 102
Position3 143 113
基本上,我将M和p的位置总数相加。我想知道是否有更简单的方法来实现这一点。位置将是随机的。是否有可能按位置拆分数据表?首先获取行名
rows<-unique(rownames(yourDataFrame))
rows您需要的是聚合函数
假设您将表存储为数据
,然后重试
condensedData <- aggregate(data, by=list(position), FUN=sum, na.rm=TRUE)
concuredData需要按如下方式使用的“聚合”:
> ddf
V1 V2 V3
1 Position1 34 56
2 Position2 45 23
3 Position3 89 78
4 Position1 56 45
5 Position3 54 35
6 Position2 56 89
> a1 = aggregate(V2~V1, ddf, sum)
> a2 = aggregate(V3~V1, ddf, sum)
> merge(a1, a2)
V1 V2 V3
1 Position1 90 101
2 Position2 101 112
3 Position3 143 113
如果您有多个列,并且您有一个大的数据集,并且数据当然是data.frame
(从文章中,不清楚您是否有matrix
或data.frame
),那么您可以使用dplyr中的summary\u
对于更大的数据集,我会使用的另一个选项是data.table
。从@Ananda Mahto的基准来看,它显然是速度方面的赢家
library(data.table)
setDT(dat)[, lapply(.SD, sum, na.rm=TRUE), by=Pos]
# Pos M P
#1: Position1 90 101
#2: Position2 101 112
#3: Position3 143 113
如果您使用的是矩阵
,不需要将其转换为data.frame
,请为行名称创建一个新列。(也许,这一选择仍然是有效的)
或者在处理矩阵
library(reshape2)
acast(melt(m1), Var1~Var2, value.var="value", sum, na.rm=TRUE)
# M P
#Position1 90 101
#Position2 101 112
#Position3 143 113
数据
行名作为列添加为data。frame
不允许重复的行名
dat <- structure(list(Pos = c("Position1", "Position2", "Position3",
"Position1", "Position3", "Position2"), M = c(34L, 45L, 89L,
56L, 54L, 56L), P = c(56L, 23L, 78L, 45L, 35L, 89L)), .Names = c("Pos",
"M", "P"), class = "data.frame", row.names = c(NA, -6L))
m1 <- structure(c(34, 45, 89, 56, 54, 56, 56, 23, 78, 45, 35, 89), .Dim = c(6L,
2L), .Dimnames = list(c("Position1", "Position2", "Position3",
"Position1", "Position3", "Position2"), c("M", "P")))
dat再来一次,只是为了好玩。这一个生成您在帖子中显示的结构
t(sapply(split(dat[-1], dat$Pos), colSums))
# M P
# Position1 90 101
# Position2 101 112
# Position3 143 113
此答案仅适用于处理矩阵
(如@akrun答案中共享的“m1”数据集):
我想你的意思是aggregate(数据[,-1],by=list(Pos=data[,1]),FUN=sum,na.rm=TRUE)
!理想情况下,我会检查所有这些,因为这三个似乎都起作用了。非常感谢你们-1对于非常复杂(而且很可能很慢)的聚合方法(.~V1,ddf,sum)
。这些方法中哪一种在基准测试中最快?@rnso,在规模上,“data.table”和“dplyr”方法,虽然tapply
也做得很好。merge
在base R中不是一个特别快的函数。我添加了一些基准测试。“data.table”显然是赢家。当你分享这么多选项时,最好也多评论一下在哪种情况下你最终会推荐哪一个。@Ananda Mahto感谢分享这些基准。我将补充一些评论。
library(reshape2)
acast(melt(m1), Var1~Var2, value.var="value", sum, na.rm=TRUE)
# M P
#Position1 90 101
#Position2 101 112
#Position3 143 113
dat <- structure(list(Pos = c("Position1", "Position2", "Position3",
"Position1", "Position3", "Position2"), M = c(34L, 45L, 89L,
56L, 54L, 56L), P = c(56L, 23L, 78L, 45L, 35L, 89L)), .Names = c("Pos",
"M", "P"), class = "data.frame", row.names = c(NA, -6L))
m1 <- structure(c(34, 45, 89, 56, 54, 56, 56, 23, 78, 45, 35, 89), .Dim = c(6L,
2L), .Dimnames = list(c("Position1", "Position2", "Position3",
"Position1", "Position3", "Position2"), c("M", "P")))
t(sapply(split(dat[-1], dat$Pos), colSums))
# M P
# Position1 90 101
# Position2 101 112
# Position3 143 113
xtabs(Freq ~ Var1 + Var2, data.frame(as.table(m1)))
# Var2
# Var1 M P
# Position1 90 101
# Position2 101 112
# Position3 143 113