【问题标题】:Melt list variables熔体列表变量
【发布时间】:2014-08-13 15:19:46
【问题描述】:

如何融化包含列表变量的tbl_df?我只是在寻找的倒数

library( dplyr )

tbl <- data.frame( x = c("A", "A", "B", "B"), y = 1:4 ) %>%
  tbl_df() %>%
  group_by(x) %>%
  do( y = .$y )

tbl
Source: local data frame [2 x 2]
Groups: <by row>

  x        y
1 A <int[2]>
2 B <int[2]>

我想到了类似的东西

tbl %>%
  mutate( y = unlist(y) )

Error: incompatible size (2), expecting 1 (the group size) or 1

library( reshape2 )
melt( tbl, id.vars = "x" )

Error: Can't melt data.frames with non-atomic columns

编辑这是sessionInfo()

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] graphics  grDevices datasets  stats     utils     methods   base     

other attached packages:
[1] dplyr_0.2     ggplot2_1.0.0 stringr_0.6.2 reshape2_1.4  plyr_1.8.1   

loaded via a namespace (and not attached):
 [1] assertthat_0.1   colorspace_1.2-4 digest_0.6.4     grid_3.1.0       gtable_0.1.2     magrittr_1.0.1   MASS_7.3-33      munsell_0.4.2   
 [9] parallel_3.1.0   proto_0.3-10     Rcpp_0.11.2      scales_0.2.4     tools_3.1.0     

dplyrplyr之后加载。

【问题讨论】:

  • @AnandaMahto 我添加了sessionInfo。它也是 0.2 版。
  • 您不能取消列出 y 并将其放回 tbl,因为它是当前大小的两倍(从 2 到 4),因此我能想到的唯一方法是 @987654331 @
  • tbl %&gt;% do(data.frame(x = .$x, y = .$y)) 怎么样?
  • 我也尝试了基于组的do,它也有效,但看起来不太好:tbl %&gt;% group_by(x) %&gt;% do(data.frame(y = unlist(.$y)))
  • @aosmith 我没有对这个进行基准测试,所以这只是猜测,但我担心这个do(data.frame(...)) 的事情比做一个简单的mutate( trallala ) 要慢得多。这就是我所说的不是很优雅。但仍然非常感谢您的建议。

标签: r dplyr


【解决方案1】:

我能想到的最佳选择是使用data.table 进行“熔化”,如下所示:

library(data.table)
setDT(tbl)[, list(y = unlist(y)), by = x][]
#    x y
# 1: A 1
# 2: A 2
# 3: B 3
# 4: B 4

【讨论】:

  • 我与dplyr 合作的次数越多,我就越高兴它与data.table 兼容,因此我可以从两个世界中选择最好的。我等了一会儿,等待一个纯粹的dplyrsolution,但即使是@aosmith 在他的 cmets 中建议的那个,看起来也不是很优雅。
【解决方案2】:

tidyr (v. 0.1.0.9000) 中的 unnest 函数是另一个很好用的选项。

library(tidyr)
unnest(tbl, y)

Source: local data frame [4 x 2]

  x y
1 A 1
2 A 2
3 B 3
4 B 4

您也可以直接将其添加到您的代码链中

data.frame( x = c("A", "A", "B", "B"), y = 1:4 ) %>%
  tbl_df() %>%
  group_by(x) %>%
  do( y = .$y ) %>%
  unnest(y)

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2020-03-25
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多