我有以下 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 中:
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
如果你使用
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