0

最终奏效的是:

        a <- cast(we, year ~ region, mean, value='response') 

虽然,我每个区域和站点只有 1 个观察值,所以平均值只是一种解决方法。我无法让 c 作为函数工作。

  • 建议答案的输出(贾斯汀)

        > 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
       > ...
    

我正在努力寻找一种方法来根据因子水平转置我的数据。我有两列的数据,一个因子和一个响应。每个因素我有很多行,所以我想转置表格,使每个因素都在一行上,不同的响应作为该行中的一列。我似乎无法根据该因素的水平在循环中进行子集化。我将不胜感激。

数据示例:

          > 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
  }

这种语法显然不正确,但这是我想要完成的想法。

谢谢你。

4

3 回答 3

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
于 2013-09-25T18:29:49.383 回答
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)
于 2013-09-25T17:41:44.690 回答
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")
于 2013-09-25T22:07:00.607 回答