我有这个 data.frame
:
set.seed(1)
df <- cbind(matrix(rnorm(26,100),26,100),data.frame(id=LETTERS,parent.id=sample(letters[1:5],26,replace = T),stringsAsFactors = F))
每一行都是来自某个主题(由
id
指定)的100个测量值,该主题与父ID(由parent.id
指定)相关联。 parent.id
和id
之间的关系是一对多的。我正在寻找一种快速的方式,以获取每个
df$id
的分数(针对其100个测量值中的每一个),其中包括其parent.id
的测量值。也就是说,对于df$id
中的每个id
,我希望将其100个测量值除以所有与其df$parent.id
对应的df$id
的测量值之和。我的尝试如下:
sum.df <- dplyr::select(df,-id) %>% dplyr::group_by(parent.id) %>% dplyr::summarise_all(sum)
fraction.df <- do.call(rbind,lapply(df$id,function(i){
pid <- dplyr::filter(df,id == i)$parent.id
(dplyr::filter(df,id == i) %>% dplyr::select(-id,-parent.id))/
(dplyr::filter(sum.df,parent.id == pid) %>% dplyr::select(-parent.id))
}))
然而,对于我的数据的真实维度:length(df$id)
= 10,000,每个数据点有1,024个测量值,这个速度已经不够快了。
您有什么想法可以改进它,最好使用dplyr
函数?
df$id
(对于它的100个测量值中的每一个)相对于其parent.id
测量值的分数。” 我不理解这句话。您能提供一个例子来说明您要计算什么吗? - Maurits Eversres = melt(DT, id=c("id", "parent.id"))[, v := value/sum(value), by=.(variable, parent.id)][]
,要回到宽格式,使用dcast(res, id + parent.id ~ variable, value.var = "v")
即可。 - Frank