我得到了一些有趣的数据,我需要根据ID字段聚合/折叠/合并这些数据,但数据框的不同列同时包含数字和字符向量。()函数似乎不能处理字符向量。我确实提出了一个可行的循环解决方案,但它并不优雅。我想知道在任何已知的包中是否有函数可以更快/更容易地完成这一任务。如果解决方案是“R base”或在data.table领域,那就更好了,但我对任何东西都感兴趣。
下面是一组示例数据:
id winter wintercolor spring springcolor summer summercolor fall fallcolor
1: a 3 blue NA <NA> NA <NA> NA <NA>
2: a NA <NA> 4 purple NA <NA> NA <NA>
3: a NA <NA> NA <NA> 2 brown NA <NA>
4: a NA <NA> NA <NA> NA <NA> 5 red
5: b NA <NA> 4 yellow NA <NA> NA <NA>
6: b NA <NA> NA <NA> NA <NA> 2 blue
7: c 4 red NA <NA> NA <NA> NA <NA>
8: c NA <NA> NA <NA> 6 orange NA <NA>
9: c NA <NA> NA <NA> NA <NA> 3 blue
10: d 5 red NA <NA> NA <NA> NA <NA>
11: d NA <NA> NA <NA> 1 blue NA <NA>
下面是我想说的:
id winter wintercolor spring springcolor summer summercolor fall fallcolor
1: a 3 blue 4 purple 2 brown 5 red
2: b NA <NA> 4 yellow NA <NA> 2 blue
3: c 4 red NA <NA> 6 orange 3 blue
4: d 5 red NA <NA> 1 blue NA <NA>
下面是我为完成这项工作而开发的工作代码(带有上面的示例数据集),但希望可以改进:
library(data.table)
id <- c('a','a','a','a','b','b','c','c','c','d','d')
winter <- c(3,NA,NA,NA,NA,NA,4,NA,NA,5,NA)
wintercolor <- c('blue',NA,NA,NA,NA,NA,'red',NA,NA,'red',NA)
spring <- c(NA,4,NA,NA,4,NA,NA,NA,NA,NA,NA)
springcolor <- c(NA,'purple',NA,NA,'yellow',NA,NA,NA,NA,NA,NA)
summer <- c(NA,NA,2,NA,NA,NA,NA,6,NA,NA,1)
summercolor <- c(NA,NA,'brown',NA,NA,NA,NA,'orange',NA,NA,'blue')
fall <- c(NA,NA,NA,5,NA,2,NA,NA,3,NA,NA)
fallcolor <- c(NA,NA,NA,'red',NA,'blue',NA,NA,'blue',NA,NA)
sampledat <- data.table(id,winter,wintercolor,spring,springcolor,summer,summercolor,fall,fallcolor)
setkey(sampledat,id)
colsets <- c('winter','spring','summer','fall')
nnn <- length(colsets)
holder <- vector('list',nnn)
for(i in 1:nnn){
#i=1
loopcols <- c('id',names(sampledat)[grepl(colsets[i],names(sampledat))])
loopdat <- sampledat[,loopcols, with=F]
col2 <- as.name(loopcols[2])
col3 <- as.name(loopcols[3])
holder[[i]] <- loopdat[!is.na(eval(col2)) & !is.na(eval(col3))]
}
combodat <- Reduce(function(x, y) merge(x, y, by='id', all=T), holder)
combodat
1条答案
按热度按时间oxf4rvwz1#
使用
dplyr
的一种方法是: