最终奏效的是:
a <- cast(we, year ~ region, mean, value='response')
虽然,我每个地区和网站只有1个观察点,所以意味着只是一个解决方法。我不能让c作为一个功能工作。
建议答案的输出(由Justin提供)
> DT
> response year
> 1: 15 2000
> 2: 6 2000
> 3: 23 2000
> 4: 23 2000
---
> 794: 3 2010
> 795: 5 2010
> 796: 1 2010
更新:所需的输出应如下所示:
> Year x1 x2 x3 x4
> 2000 4 5 16 22
> 2001 6 11 2 18
> 2002 1 0 21 10
> ...
我正在努力寻找一种基于因子水平转换数据的方法。我有2列数据,一个因子和一个响应。每个因素都有很多行,所以我想转换表格,使每个因子在一行上,不同的响应作为该行的一列。我似乎无法基于该因子的级别在循环内进行子集化。我很感激任何见解。
数据示例:
> response year
> 5 2001
> 10 2001
> 8 2001
> 1 2002
> 7 2010
> levels(data$year)
[1] "2000" "2001" "2002" "2003" "2004" "2005" ...
w <- matrix(0,54,15)
for(i in 1:levels(data$year)){
w[i] <- levels(data$year)==i
}
这种语法显然不正确,但它是我想要实现的目标。
谢谢。
答案 0 :(得分:1)
使用data.table
包这很简单:
library(data.table)
DT <- data.table(data)
DT[, as.list(value), by=year]
但是,如果每年观察次数不同,这将会分崩离析。代替:
DT[, list(values = list(value)), by=year]
或使用基础R:
tapply(data$value, data$year, c)
答案 1 :(得分:1)
这是另一种方式,使用aggregate
:
> set.seed(1)
> data <- data.frame(year = rep(2000:2010, each=10), value = sample(3:30, 110, TRUE))
> aggregate(value~year, data=data, FUN=c)
year value.1 value.2 value.3 value.4 value.5 value.6 value.7 value.8 value.9 value.10
1 2000 10 13 19 28 8 28 29 21 20 4
2 2001 8 7 22 13 24 16 23 30 13 24
3 2002 29 8 21 6 10 13 3 13 27 12
4 2003 16 19 16 8 26 21 25 6 23 14
5 2004 25 21 24 18 17 25 3 16 23 22
6 2005 16 27 15 9 4 5 11 17 21 14
7 2006 28 11 15 12 21 10 16 24 5 27
8 2007 12 26 12 12 16 27 27 13 24 29
9 2008 15 22 14 12 24 8 22 6 9 7
10 2009 9 4 20 27 24 25 15 14 25 19
11 2010 21 12 10 30 20 8 6 16 28 19
答案 2 :(得分:0)
如果我每年的回复数量不同,我可能会遇到这个问题,首先制作一个新变量来表示每年的回复,然后使用dcast
投出该数据集。默认情况下,dcast
会使用NA
填充缺失值,但您可以根据需要进行更改。
set.seed(1)
data = data.frame(year = c(rep(2000:2010, each=10), 2011), value = sample(3:30, 111, TRUE))
require(reshape2)
require(plyr)
# Create a new variable representing the number of responses per year and add to dataset
dat2 = ddply(data, .(year), transform,
response = interaction("x", 1:length(value), sep = ""))
dcast(dat2, year ~ response, value.var = "value")