dcast 2列

时间:2015-02-18 03:01:35

标签: r

我有以下data.frame

group <- sample(c("egyptian", "american", "irish", "australian"), 50, TRUE)
E <- c(rnorm(50, 5, 6))
F <- c(rnorm(50, 7.8, 4.5))
G <- c(rnorm(50, 65, 16.7))
test <- data.frame(group=group, E=E, F=F, G=G)

我的目标是生成一个data.frame,其中包含group作为标题,并在下面E列出相应的值。

像这样data.frame

egyptian <- c(rnorm(50,5,6))
american<- c(rnorm(50,5,6))
irish<- c(rnorm(50,5,6))
australian<- c(rnorm(50,5,6)) 
test <- data.frame(egyptian=egyptian, american=american, 
                   irish=irish, australian=australian)

我尝试对2列进行子集,然后使用dcast,但它失败了。 从长到宽可以dcast 2列吗?

1 个答案:

答案 0 :(得分:2)

正如评论中提到的@jbaums,每个组的大小不一样。

  table(test$group)
  # american australian   egyptian      irish 
  #   7         18          9         16 

最好设置种子以使其可重复。即。

  set.seed(1)
  group <- sample(c("egyptian", "american", ....)

要将初始输入转换为预期输出(基于&#34; E&#34;列),我们可能需要根据分组变量创建一个序列(&#34; group&#34;)

library(reshape2) 
test$ind <- with(test, ave(seq_along(group), group, FUN=seq_along))
dcast(test, ind~group, value.var='E')

或另一个base R选项是使用xtabs

xtabs(E~ind+group, test)

但请注意,这将填补&#39; 0&#39; 0对于那些缺失的价值组合。对于dcast,默认情况下,我们会获得&#34; NA&#34;对于缺失的组合,我们可以通过fill参数进行更改。