2017-06-24 67 views
1

列表我有一个数据帧等如下:分割数据帧装入列的子集的中的R

> 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 

在上述例子中,我想找出如何获得的前三列到与最后三列分开的对象(即,由dat中的ID分开)。在将practice.data放入列表后,我计划使用lapply函数对每个列表对象的行进行求和,并为每个ID返回一个向量。

我已经试过这个for循环,但它是相当低效率,并有太多的问题,所以似乎使用列表和应用可能是最好的,如果我能弄清楚如何做到这一点。

的最终期望的输出会是这样的:

A B 
1 3 
2 2 
2 2 
3 1 
1 2 

回答

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 
0

这里是一个melt/dcast选项

library(data.table) 
dcast(melt(setDT(practice.data, keep.rownames = TRUE), id.var = 'rn', 
    variable.name = 'samples')[, sum(value), .(rn, samples) 
    ][dat, on = .(samples)], rn~ID, value.var = 'V1', sum)[, rn := NULL][] 
# A B 
#1: 1 3 
#2: 2 2 
#3: 2 2 
#4: 3 1 
#5: 1 2