我有一个如下所示的数据框:
> set.seed(123)
> dat <- data.frame(samples = c("a.1","a.2","a.3","b.1","b.2","b.3"), ID = c(rep("A",3),rep("B",3))
> dat
samples ID
1 a.1 A
2 a.2 A
3 a.3 A
4 b.1 B
5 b.2 B
6 b.3 B
> practice.data <- data.frame(a.1 = round(runif(5)), a.2=round(runif(5)),
a.3=round(runif(5)),b.1=round(runif(5)),b.2=round(runif(5)),b.3=round(runif(5)))
> practice.data
a.1 a.2 a.3 b.1 b.2 b.3
1 0 0 1 1 1 1
2 1 1 0 0 1 1
3 0 1 1 0 1 1
4 1 1 1 0 1 0
5 1 0 0 1 1 0
在上面的例子中,我想弄清楚如何将前三列从后三列变成一个单独的对象(即,用ID
in分隔dat
)。后practice.data
放入列表,我打算使用lapply函数来汇总行对于每个列表对象,返回针对每个ID的向量。
我已经用 for 循环尝试过这个,但它效率很低并且有太多问题,所以如果我能弄清楚如何去做,似乎使用列表和应用可能是最好的。
最终期望的输出是这样的:
A B
1 3
2 2
2 2
3 1
1 2
# map column names to the ID
g <- dat$ID[match(names(practice.data), dat$samples)]
g
#[1] A A A B B B
#Levels: A B
# split the practice data into smaller data frames based on the map and call rowSums
as.data.frame(lapply(split.default(practice.data, g), rowSums))
# A B
#1 1 3
#2 2 2
#3 2 2
#4 3 1
#5 1 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句