根据 ID 列合并多行

问题描述 投票:0回答:2

我有以下 df:

df<- structure(list(X18.digit.contact.id = c("0034y00002kIZ3rAAG", 
"0034y00002kIZ3rAAG", "0034y00002kIZ3rAAG", "0034y00002PpX11AAF", 
"0034y00002PpX11AAF", "0034y00002PpX11AAF", "0034y00002jHjYKAA0", 
"0034y00002jHjYKAA0", "0034y00002jHjYKAA0"), `Fitness Goal` = c(2L, 
NA, NA, -1L, NA, NA, NA, 1L, NA), `Nutrition/Hydration Goal` = c(NA, 
NA, NA, NA, 0L, NA, 2L, NA, NA), `Lifestyle Goal` = c(NA, NA, 
2L, NA, NA, 0L, NA, NA, 1L)), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -9L), groups = structure(list(
    X18.digit.contact.id = c("0034y00002PpX11AAF", "0034y00002jHjYKAA0", 
    "0034y00002kIZ3rAAG"), .rows = structure(list(4:6, 7:9, 1:3), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -3L), .drop = TRUE))

我希望根据 X18contactid 列将这些行折叠在一起。因此,最终的 df 将由 3 行(3 个唯一 ID)和四列(id、健身目标、营养/水合作用、生活方式)组成。

我尝试了在这里找到的各种解决方案,从汇总函数到

 lapply: df2<- df[, lapply(.SD, paste0, collapse=""), by=X18.digit.contact.id] 

然而,它们似乎都不起作用。我可以将其旋转更长的时间,删除 NA,然后再次将其旋转宽,这给了我想要的行格式,但是,它给出了以下警告消息,限制了我之后能够在列上执行的功能:

Values from `value` are not uniquely identified; output will contain list-cols.

注意:当我使用

pivot_wider
时,我可以通过为每个行分配唯一的行号来消除此警告消息,但是,输出与
df
相同,其中行不按 id 变量分组。

任何对此的帮助/见解将不胜感激。

r data.table
2个回答
0
投票

在基础 R 中:

aggregate(.~X18.digit.contact.id, df, na.omit, na.action = identity)

  X18.digit.contact.id Fitness Goal Nutrition/Hydration Goal Lifestyle Goal
1   0034y00002jHjYKAA0            1                        2              1
2   0034y00002kIZ3rAAG            2                        1              2
3   0034y00002PpX11AAF           -1                        0              0

pivot_longer(df,-1, values_drop_na = TRUE)%>%
   pivot_wider()

# A tibble: 3 × 4
# Groups:   X18.digit.contact.id [3]
  X18.digit.contact.id `Fitness Goal` `Nutrition/Hydration Goal` `Lifestyle Goal`
  <chr>                         <int>                      <int>            <int>
1 0034y00002kIZ3rAAG                2                          1                2
2 0034y00002PpX11AAF               -1                          0                0
3 0034y00002jHjYKAA0                1                          2                1

0
投票

如果你使用

data.table
,你可以尝试

> setDT(df)[, lapply(.SD, na.omit), X18.digit.contact.id]
   X18.digit.contact.id Fitness Goal Nutrition/Hydration Goal Lifestyle Goal
1:   0034y00002kIZ3rAAG            2                        1              2
2:   0034y00002PpX11AAF           -1                        0              0
3:   0034y00002jHjYKAA0            1                        2              1
© www.soinside.com 2019 - 2024. All rights reserved.