当同时存在要折叠的数值列和字符列时,R基于分组变量合并数据框中的行

zz2j4svz  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(134)

我得到了一些有趣的数据,我需要根据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
oxf4rvwz

oxf4rvwz1#

使用dplyr的一种方法是:

df <- setDF(sampledat)

modified_max <- function(x){
  out <- suppressWarnings(max(x,na.rm=T) )
  out <- ifelse(is.infinite(out),NA_real_,out)
  out
}

df %>%
  group_by(id) %>%
  summarise_all(modified_max) 

  id    winter wintercolor spring springcolor summer summercolor  fall fallcolor
  <chr>  <dbl> <chr>        <dbl> <chr>        <dbl> <chr>       <dbl> <chr>    
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

相关问题