簡體   English   中英

用列表列聚合data.frame

[英]aggregate data.frame with list column

在data.frame的每一行中都有一列包含向量。 我想匯總和合並向量。 但是,似乎我無法使用此類數據執行此操作。 您將如何結合這些向量?

“錯誤:變量'dv'的無效類型(列表)”

#Problem: aggregate data.frame with list-column

#reproducible code
set.seed(1)
some_list <- replicate(40, sample(c(1:8), size=sample(1:6, 1), replace=TRUE))
exdf <- expand.grid(id=c(1:10), content=c(1:4))
exdf$dv <- some_list


#this throws error
aggregate(
formula=dv~id,
data=exdf,
FUN=c
)

您可以使用dplyr unlistunlistlist

library(dplyr)
df1 <- exdf %>% group_by(id) %>% summarise(dv = list(unlist(dv))) 

df1
# Source: local data frame [10 x 2]

#      id         dv
#   <int>     <list>
#1      1 <int [13]>
#2      2 <int [15]>
#3      3 <int [13]>
#4      4 <int [15]>
#5      5 <int [13]>
#6      6 <int [15]>
#7      7 <int [13]>
#8      8 <int [15]>
#9      9 <int [13]>
#10    10 <int [15]>

df1$dv[[1]]
# [1] 3 5 2 6 4 7 8 2 6 2 7 3 4

或者data.table

library(data.table)
setDT(exdf)[, .(list(unlist(dv))), id]

#    id           V1
# 1:  1 3,5,2,6,4,7,
# 2:  2 2,8,8,6,6,1,
# 3:  3 2,6,4,7,8,2,
# 4:  4 7,4,6,4,1,4,
# 5:  5 4,7,8,2,6,2,
# 6:  6 4,1,4,2,7,6,
# 7:  7 7,3,4,3,5,2,
# 8:  8 4,2,7,6,2,8,
# 9:  9 3,5,2,6,4,7,
#10: 10 2,8,8,6,6,1,

在這里,我們使用一些不可讀的基數R。如果使用dplyr管道使代碼可讀,則最好使用group/summarise

data.frame(id = unique(exdf$id),
           dv = cbind(lapply(split(exdf, exdf$id),
                             function(x) unlist(x$dv))))

   id                                                      dv
1   1                   3, 5, 6, 4, 7, 4, 2, 1, 6, 5, 5, 8, 5
2   2    2, 8, 8, 6, 6, 1, 1, 7, 7, 4, 4, 7, 5, 5, 2, 3, 6, 4
3   3                            2, 6, 5, 6, 3, 3, 8, 6, 6, 1
4   4                7, 4, 6, 8, 3, 4, 2, 4, 5, 5, 3, 4, 5, 2
5   5    4, 7, 8, 2, 6, 2, 6, 3, 5, 8, 6, 3, 4, 2, 1, 3, 2, 3
6   6                      4, 1, 7, 1, 8, 6, 4, 7, 8, 4, 1, 3
7   7                      7, 3, 4, 7, 3, 3, 4, 3, 6, 7, 7, 4
8   8                4, 2, 7, 6, 8, 7, 4, 8, 4, 4, 2, 8, 6, 6
9   9 1, 6, 4, 7, 6, 8, 4, 6, 4, 3, 4, 5, 2, 2, 5, 8, 3, 2, 8
10 10    5, 5, 7, 1, 4, 2, 6, 1, 2, 2, 1, 1, 6, 8, 8, 2, 7, 6

如果我們對使用“聚合”一無所知,則可以通過將數字列表更改為字符來執行以下操作。 然后使用正則表達式提取這些數字。

exdf$dv <- as.character(exdf$dv)
aggregate(
  formula=dv~id,
  data=exdf,
  FUN = function(x) regmatches(paste0(x, collapse = ""),
                               gregexpr('[0-9]', paste0(x, collapse = ""))))

   id                                                      dv
1   1                   3, 5, 6, 4, 7, 4, 2, 1, 6, 5, 5, 8, 5
2   2    2, 8, 8, 6, 6, 1, 1, 7, 7, 4, 4, 7, 5, 5, 2, 3, 6, 4
3   3                            2, 6, 5, 6, 3, 3, 8, 6, 6, 1
4   4                7, 4, 6, 8, 3, 4, 2, 4, 5, 5, 3, 4, 5, 2
5   5    4, 7, 8, 2, 6, 2, 6, 3, 5, 8, 6, 3, 4, 2, 1, 3, 2, 3
6   6                      4, 1, 7, 1, 8, 6, 4, 7, 8, 4, 1, 3
7   7                      7, 3, 4, 7, 3, 3, 4, 3, 6, 7, 7, 4
8   8                4, 2, 7, 6, 8, 7, 4, 8, 4, 4, 2, 8, 6, 6
9   9 1, 6, 4, 7, 6, 8, 4, 6, 4, 3, 4, 5, 2, 2, 5, 8, 3, 2, 8
10 10    5, 5, 7, 1, 4, 2, 6, 1, 2, 2, 1, 1, 6, 8, 8, 2, 7, 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM