首页 > 解决方案 > 合并具有相似信息的行

问题描述

我有几行的数据框,我需要合并具有相同 ID 的行。

a=read.csv("a.csv")
view(a)

ID  Value1  Value2  Value3  Value4  Value5  Value6
1076    2940    NA  NA  2   NA  NA
1076    2940    1   A-  NA  302 549
1109    2940    NA  NA  3   NA  NA
1109    2940    NA  A-  NA  700 150

我需要这样的结果

ID  Value1  Value2  Value3  Value4  Value5  Value6
1076    2940    1   A-  2   302 549
1109    2940    NA  A-  3   700 150                     

我已经查看了类似问题的答案(Merging rows with shared information)。但我在结果中遇到错误。

library(dplyr)
f <- function(x) {
  x <- na.omit(x)
  if (length(x) > 0) paste(x,collapse='-') else NA
}
a_merge <- a %>% group_by(ID)%>%summarise_all(list(f))

但我收到以下错误

Error: Column `Value2` can't promote group 1 to character

请帮忙。

标签: rmergena

解决方案


一个选项是创建一个条件,if/else当列中的所有值都是NAelse获取unique非 NA 元素时返回 NAlist

library(dplyr)
a %>% 
   group_by(ID) %>%
   summarise_all(list(~ list(if(all(is.na(.))) NA else unique(.[!is.na(.)]))))
# A tibble: 2 x 7
#     ID Value1    Value2    Value3    Value4    Value5    Value6   
#  <int> <list>    <list>    <list>    <list>    <list>    <list>   
#1  1076 <int [1]> <int [1]> <chr [1]> <int [1]> <int [1]> <int [1]>
#2  1109 <int [1]> <lgl [1]> <chr [1]> <int [1]> <int [1]> <int [1]>

编辑:

1) 包裹在一个list

2) @Gregor 的评论 - 只获取unique非 NA 元素

数据

a <- structure(list(ID = c(1076L, 1076L, 1109L, 1109L), Value1 = c(2940L, 
2940L, 2940L, 2940L), Value2 = c(NA, 1L, NA, NA), Value3 = c(NA, 
"A-", NA, "A-"), Value4 = c(2L, NA, 3L, NA), Value5 = c(NA, 302L, 
NA, 700L), Value6 = c(NA, 549L, NA, 150L)), class = "data.frame", row.names = c(NA, 
-4L))

推荐阅读