旋转包含列表的数据框

时间:2016-02-24 21:59:11

标签: r

这是我试图转动的数据框,或者说是重塑:

  Value            Word list
    1        c("cat", "dog")
    1        c("apple", "banana")
    2        c("cat", "dog")
    2        c("peach", "orange")
    3        c("cat", "dog")
    3        c("berries", "coconut")

这是预期的结果(基本上只是将具有相同Value的元素组合起来,以list获得一个大Value}:

    Value            Word list
    1        c("cat", "dog", "apple", "banana")
    2        c("cat", "dog", "peach", "orange")
    3        c("cat", "dog", "berries", "coconut")

提前感谢能够提供帮助的任何人(感谢所有已为我评论/编辑过我可怜的帖子的人)。

为了让您知道为什么我在数据框中获取列表,我实际上正在进行词性标注。在使用str_split分解注释列之后,我在数据框中得到了一个列表,因为每个注释的长度各不相同。每个评论都带有一个分数,我需要按分数创建一个单词数据框。

根据您的要求,> STR(DF1):

'data.frame':   6 obs. of  2 variables:
 $ Value   : num  1 1 2 2 3 3
 $ Wordlist:List of 6
  ..$ : chr  "cat" "dog"
  ..$ : chr  "apple" "banana"
  ..$ : chr  "cat" "dog"
  ..$ : chr  "peach" "orange"
  ..$ : chr  "cat" "dog"
  ..$ : chr  "berries" "coconut"
  ..- attr(*, "class")= chr "AsIs"

并且> dput(DF1):

structure(list(Value = c(1, 1, 2, 2, 3, 3), Wordlist = structure(list(
c("cat", "dog"), c("apple", "banana"), c("cat", "dog"), c("peach", 
"orange"), c("cat", "dog"), c("berries", "coconut")), class = "AsIs")), .Names = c("Value", "Wordlist"), row.names = c(NA, -6L), class = "data.frame")

3 个答案:

答案 0 :(得分:6)

我在这里使用了data.table

library(data.table); setDT(df)

df[, .(word_list = list(unlist(Word.list))), by = Value]
#    Value               word_list
# 1:     1    cat,dog,apple,banana
# 2:     2    cat,dog,peach,orange
# 3:     3 cat,dog,berries,coconut

unlist递归地将每个Word.list中的Value的所有元素都拉到一个向量中。然后我们将这些返回到list,最后将所有内容包装在命名的list中以创建列(名称list被屏蔽,因为.与{data.table相同1}})。本来可以使用list(word_list=...),但我认为单词列表已经得到了足够的关注,只有一个答案。

答案 1 :(得分:6)

Base R解决方案,使用@ akrun的数据设置:

aggregate(df1$Wordlist,list(df1$Value),unlist,simplify=FALSE)

如果重要的话,其他解决方案可能会更快。

答案 2 :(得分:5)

我们也可以使用dplyr/tidyr

library(dplyr)
library(tidyr)
unnest(df1, Wordlist) %>% 
            group_by(Value) %>% 
            nest(Wordlist)

数据

df1 <- data.frame(Value = c(1, 1, 2, 2, 3, 3),
    Wordlist = I(list(c('cat', 'dog'), c("apple", "banana") , 
 c("cat", "dog") , c("peach", "orange") , c("cat", "dog") , 
 c("berries", "coconut"))))