对列表列进行汇总,获取第一个值(以 dplyr 表示)

dez*_*000 4 r summary dplyr across

我有一个大数据框,其中有一些半重复的条目,我试图通过dplyr::summarise. 这适用于数字列、字符列和逻辑列,但不适用于列表列。

mydata <- tibble(A = c(1,1,2,2,3,3),
                 B = c(1,NA,4,5,7,7),
                 C = list(1:3, 1:3, 2:4, 2:4, 3:6, 3:6))

dedupedData <- mydata %>%
  group_by(A) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)

按预期工作;

dedupedData <- mydata %>%
  group_by(A) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE),
            across(where(is.list), first))
Run Code Online (Sandbox Code Playgroud)

失败与我的数据集不同。上面通过分散 C 的范围来创建重复的行数,即 A1 组获得 1:3,A2 获得 2:4,A3 获得 3:6。对于我的数据:

dedupedData <- mydata %>%
  group_by(A, B) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE),
            across(where(is.character), first),
            across(where(is.logical), first),
            across(where(is.POSIXct), first),
            across(where(is.list), first))
Run Code Online (Sandbox Code Playgroud)

一直有效,直到我包含 is.list 行,然后它会中断:

错误:summarise()输入有问题..5。x 'names' 属性 [11] 的长度必须与向量 [9] 相同

有谁知道如何解决这个问题?分组时,列表项会像其他列一样被拆分,因此组 A1 的 C 值应该是

mydata$C[1:2]
Run Code Online (Sandbox Code Playgroud)

[ 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

谢谢。相关地,如果有人知道如何创建不是范围的列列表,那就太好了 - 我之前已经设法通过分组摘要来做到这一点,但对于这个 reprex,我复制了R For Data Science 示例,但似乎并没有通用,即如果将 mydata 的最后一行更改为

C = list(c(1,2,3), 1:3, 2:4, 2:4, 3:6, 3:6))
Run Code Online (Sandbox Code Playgroud)

那么 C1 将是“c(1,2,3)”,而不是评估逗号分隔的术语,似乎不允许任何不是单个值或范围的东西?

干杯!

akr*_*run 5

我们按'A','B'分组,获取first的元素list,并将其包装在 alistacross

library(dplyr)
out <- mydata %>%
  group_by(A, B) %>% 
  summarise(across(where(is.numeric), mean, na.rm = TRUE), 
            across(where(is.list),  ~ list(first(.)))) 
Run Code Online (Sandbox Code Playgroud)

-输出

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]>
Run Code Online (Sandbox Code Playgroud)

如果我们想获取第一个元素,另一个选择是slice

mydata %>% 
     group_by(A, B) %>%
     slice(1)
Run Code Online (Sandbox Code Playgroud)

  • 就这样了 - 谢谢你,很抱歉延迟回复。应在管道中添加: `%&gt;% select(colnames(mydata))` 以重新排序列以匹配原始值。您有关于“where”中波浪号构造的任何信息吗?并且必须在“first”中显式输入“(.)”吗?我认为这与波浪号有​​关。再次感谢! (2认同)