r - 合并具有相似信息的行
问题描述
我有几行的数据框,我需要合并具有相同 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
请帮忙。
解决方案
一个选项是创建一个条件,if/else
当列中的所有值都是NA
或else
获取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))
推荐阅读
- python - 试图在 pygame 中旋转图像以进行移动
- python - seaborn.jointplot() 中的参数
- python - 从元组列表中过滤掉整数
- javascript - JavaScript display 属性只影响前 3 个元素
- c++ - No compile_commands.json file using cmake with vs code on windows
- python - 无法在此处确定问题
- javascript - 如何在本机反应中创建“全局状态”,以便将用户输入发送到另一个页面?
- ios - 为什么在swift iOS中使用MFMailComposeViewController时会自动调用didFinishWith委托方法?
- angular - 如何构建 Spring Boot 微服务
- c - 基于 LinkedList 的队列,创建新队列时不能返回空指针