Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中压缩/合并表格中的单元格_R_Split - Fatal编程技术网

在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

我想在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的位置总数相加。我想知道是否有更简单的方法来实现这一点。位置将是随机的。是否有可能按位置拆分数据表?

首先获取行名

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