循环在一个因子的每个级别上

时间:2013-09-25 17:29:42

标签: r loops levels

最终奏效的是:

        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
  }

这种语法显然不正确,但它是我想要实现的目标。

谢谢。

3 个答案:

答案 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")