2017-06-24 89 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