问题描述
我有一个大型数据框,其中包含一些我试图通过dplyr::summarise
进行合并的半重复条目。对于数字,字符和逻辑列,但不适用于列表列,此方法很好用。
mydata <- tibble(A = c(1,1,2,3,3),B = c(1,NA,4,5,7,7),C = list(1:3,1:3,2:4,3:6,3:6))
dedupedData <- mydata %>%
group_by(A) %>%
summarise(across(where(is.numeric),mean,na.rm = TRUE))
按预期工作;
dedupedData <- mydata %>%
group_by(A) %>%
summarise(across(where(is.numeric),na.rm = TRUE),across(where(is.list),first))
失败与我的数据集不同。上面通过扩展C的范围创建了重复的行数,即组A1为1:3,A2为2:4,A3为3:6。对于我的数据:
dedupedData <- mydata %>%
group_by(A,B) %>%
summarise(across(where(is.numeric),across(where(is.character),first),across(where(is.logical),across(where(is.POSIXct),first))
工作直到我包含is.list行,然后它以以下方式中断:
错误:
summarise()
输入..5
出现问题。 x'名称'属性 [11]的长度必须与向量[9]的长度相同
有人知道如何解决吗?如果将其分组,则期望列表项与其他列一样被拆分,因此组A1的C值应为
mydata$C[1:2]
[[2]] 1 1 2 3
(第一个列表项是R中的双方括号,但由于某些原因不在此列)
还有first(mydata$C[1:2])
1 1 2 3
看起来不错,我只需要将其发送到目标单元格即可。
我还需要以这种方式显式链接across
行吗?我尝试过!is.numeric
,也尝试过is.POSIXct | is.character | is.logical | is.list
。
谢谢。与此相关的是,如果有人知道如何创建不是很好的范围的列列表-之前,我已经设法通过分组汇总来做到这一点,但是对于此代表,我复制了 R For Data Science { {3}},但似乎没有通用性,例如,如果将mydata的最后一行更改为
C = list(c(1,3:6))
那么C1将是“ c(1,3)”,而不是评估用逗号分隔的术语,似乎不允许任何不是单个值或范围的东西?
干杯!
解决方法
我们将“ A”,“ B”分组,得到input
的{{1}}元素,然后将其包装在first
中的list
list
-输出
across
如果我们想获取第一个元素,则另一个选择是library(dplyr)
out <- mydata %>%
group_by(A,B) %>%
summarise(across(where(is.numeric),mean,na.rm = TRUE),across(where(is.list),~ list(first(.))))
out
# A tibble: 5 x 3
# Groups: A [3]
# A B C
# <dbl> <dbl> <list>
#1 1 1 <int [3]>
#2 1 NA <int [3]>
#3 2 4 <int [3]>
#4 2 5 <int [3]>
#5 3 7 <int [4]>