如何在R中进行迭代?

时间:2016-04-20 07:00:59

标签: r loops iteration

我使用的数据集在不同的时间点包含相同变量的值。在下面的示例中,我在时间点1和2处具有变量a和b的值。

> set.seed(1)
> data <- data.frame(matrix(sample(16), ncol = 4))
> names(data) <- paste(rep(c("a", "b"), each = 2), 1:2, sep = "")
> data
  a1 a2 b1 b2
1  5  3 14 13
2  6 10  1  8
3  9 11  2  4
4 12 15  7 16

现在,假设我想为两个时间点计算一个新变量,以便它包含a和b的总和(而不是如下例所示的NA)。由于我的实际数据集包含大约15个不同的变量和10个时间点(所以150列),我想自动计算10个新变量。

> data[, paste("ab", 1:2, sep = "")] <- NA
> data
  a1 a2 b1 b2 ab1 ab2
1  5  3 14 13  NA  NA
2  6 10  1  8  NA  NA
3  9 11  2  4  NA  NA
4 12 15  7 16  NA  NA

我之前使用的是Stata,在那里我可以创建一个简单的foreach&#39;循环来做到这一点。像下面的东西。

foreach t of numlist 1/2 {
    generate ab`t' = a`t' + b`t'
}

但是我已经知道在R中使用循环是不可行的,我也不知道如何循环使用R中的变量名。

那么在R中我的问题的正确解决方案是什么?

4 个答案:

答案 0 :(得分:3)

这将复制您在Stata中使用的相同foreach循环。

for(i in 1:2){
  data[, paste("ab", i, sep="")] <- 
    data[,paste("a", i, sep="")] + data[, paste("b", i, sep="")]
}

输出如下:

> data
  a1 a2 b1 b2 ab1 ab2
1 15  1 16 12  31  13
2 10  7 14  3  24  10
3  2  5  9  4  11   9
4  6  8 13 11  19  19

答案 1 :(得分:2)

你可以不用迭代:

data$ab1 <- data$a1 + data$b1
data$ab2 <- data$a2 + data$b2

data <- transform(data, ab1=a1+b1, ab2=a2+b2)

顺便说一句:
最好不要命名对象data,因为data=通常是函数中的参数。

答案 2 :(得分:2)

这是一种方法。我们迭代列名的唯一值,并在这些唯一值与colname值匹配时计算rowSums

sapply(unique(sub('\\D', '', names(data))), 
             function(i) rowSums(data[,grepl(i, sub('\\D', '', names(data)))]))
#      1  2
#[1,] 17 23
#[2,] 24 22
#[3,] 14 10
#[4,] 15 11

答案 3 :(得分:2)

R方式执行此操作,

  1. 通过*apply函数
  2. 使用一些本机迭代
  3. 使用内置rowSums(如@Sotos中的答案)
  4. 使用赋值给data.frame,即`]`&lt; -
  5. 一起

    data[paste0('ab', 1:2)] <- sapply(1:2,
                                      function(i)
                                         rowSums(data[paste0(c('a', 'b'), i)]))
    data
    
    #   a1 a2 b1 b2 ab1 ab2
    # 1  5  3 14 13  19  16
    # 2  6 10  1  8   7  18
    # 3  9 11  2  4  11  15
    # 4 12 15  7 16  19  31
    

    ps,在程序中使用vapply代替,你需要提供一个额外的参数来指定输出的形状,但它更安全,有时更快