我尝试更改R中的数据帧,以便通过测量对多行进行分组。该表格具有一个位置(km
),一个尺寸(mm
)和count
个尺寸合页中的内容,site
和year
。我想获取大小,从每个大小创建一列(在此示例中为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,但我没有为我工作,不确定为什么。下面的答案效果更好。
答案 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