在 dplyr 中跨列表列汇总,获取第一个值
Summarise across list columns, get first value, in dplyr
我有一个大型数据框,其中包含一些我试图通过 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))
按预期工作;
dedupedData <- mydata %>%
group_by(A) %>%
summarise(across(where(is.numeric), mean, 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), mean, na.rm = TRUE),
across(where(is.character), first),
across(where(is.logical), first),
across(where(is.POSIXct), first),
across(where(is.list), first))
一直有效,直到我包含 is.list 行,然后它中断:
Error: Problem with summarise()
input ..5
. x 'names' attribute
[11] must be the same length as the vector [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 example,但它似乎不具有普遍性,即如果您将 mydata 的最后一行更改为
C = list(c(1,2,3), 1:3, 2:4, 2:4, 3:6, 3:6))
然后 C1 将是“c(1,2,3)”而不是评估逗号分隔的项,似乎不允许任何不是单个值或范围的东西?
干杯!
我们按'A'、'B'分组,得到list
的first
元素,并用list
包裹在[=16]中=]
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]>
如果我们想获取第一个元素,另一种选择是slice
mydata %>%
group_by(A, B) %>%
slice(1)
我有一个大型数据框,其中包含一些我试图通过 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))
按预期工作;
dedupedData <- mydata %>%
group_by(A) %>%
summarise(across(where(is.numeric), mean, 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), mean, na.rm = TRUE),
across(where(is.character), first),
across(where(is.logical), first),
across(where(is.POSIXct), first),
across(where(is.list), first))
一直有效,直到我包含 is.list 行,然后它中断:
Error: Problem with
summarise()
input..5
. x 'names' attribute [11] must be the same length as the vector [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 example,但它似乎不具有普遍性,即如果您将 mydata 的最后一行更改为
C = list(c(1,2,3), 1:3, 2:4, 2:4, 3:6, 3:6))
然后 C1 将是“c(1,2,3)”而不是评估逗号分隔的项,似乎不允许任何不是单个值或范围的东西?
干杯!
我们按'A'、'B'分组,得到list
的first
元素,并用list
包裹在[=16]中=]
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]>
如果我们想获取第一个元素,另一种选择是slice
mydata %>%
group_by(A, B) %>%
slice(1)