转置列和组数据帧

时间:2017-11-20 21:57:55

标签: r dataframe

我尝试更改R中的数据帧,以便通过测量对多行进行分组。该表格具有一个位置(km),一个尺寸(mm)和count个尺寸合页中的内容,siteyear。我想获取大小,从每个大小创建一列(在此示例中为2,4和6),并将相应的计数放入该位置,站点和年份的每一行。

这似乎是转置和分组的组合,但我无法找到在R中实现此目的的方法。我已查看t()dcast()和{ {1}},但那些并不是真的很接近。

所以我会这样做:

aggregate()

对此:

df <- data.frame(km=c(rep(32,3),rep(50,3)), mm=rep(c(2,4,6),2), count=sample(1:25,6), site=rep("A", 6), year=rep(2013, 6))

  km mm count site year
1 32  2    18    A 2013
2 32  4     2    A 2013
3 32  6    12    A 2013
4 50  2     3    A 2013
5 50  4    17    A 2013
6 50  6    21    A 2013

编辑:我在建议的副本中尝试了solution,但我没有为我工作,不确定为什么。下面的答案效果更好。

2 个答案:

答案 0 :(得分:4)

正如上面的评论所示,我们可以使用sep中的spread参数:

library(tidyr)
spread(df, mm, count, sep = "_")
  km site year mm_2 mm_4 mm_6
1 32    A 2013    4   20    1
2 50    A 2013   15   14   22

答案 1 :(得分:2)

正如您所提到的dcast(),这是使用它的方法。

set.seed(1)
df <- data.frame(km=c(rep(32,3),rep(50,3)), 
                 mm=rep(c(2,4,6),2),
                 count=sample(1:25,6),
                 site=rep("A", 6),
                 year=rep(2013, 6))

library(reshape2)
dcast(df, ... ~ mm, value.var="count")

#   km site year  2  4  6
# 1 32    A 2013 13 10 20
# 2 50    A 2013  3 17  1

如果您想要一些挑战,可以尝试基本功能reshape()

df2 <- reshape(df, v.names="count", idvar="km", timevar="mm", ids="mm",  direction="wide")
colnames(df2) <- sub("count.", "mm_", colnames(df2))
df2

#   km site year mm_2 mm_4 mm_6
# 1 32    A 2013   13   10   20
# 4 50    A 2013    3   17    1