在dplyr中汇总列表列,获取第一个值

问题描述

我有一个大型数据框,其中包含一些我试图通过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]

[{1] 1 1 2 3

[[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]>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...