循环,使用条件

时间:2017-04-27 16:18:04

标签: r for-loop grepl

我有一些数据包含400多列和约80个观察值。我想使用for循环遍历每一列,如果它包含所需的前缀exp_,我想创建一个新列,该值除以引用列,存储为相同的名称但后缀为_pp。如果使用另一个前缀rev_,我也想做其他事情,但我认为只要我能解决第一个问题,我就可以自己解决其余问题。一些示例数据如下:

exp_alpha     exp_bravo    rev_charlie     rev_delta     pupils
10            28           38              95            2
24            56           39              24            5
94            50           95              45            3
15            93           72              83            9
72            66           10              12            3

第一次尝试时,循环正常运行,但只存储了if语句为true的最后一列,而不是存储if语句为true的每一列。我做了一些调整并丢失了代码,但现在这个代码运行没有错误,但根本没有修改数据框。

for (i in colnames(test)) {
  if(grepl("exp_", colnames(test)[i])) {
    test[paste(i,"pp", sep="_")] <- test[i] / test$pupils)
  }
}

我对这是做什么的理解:

  1. 循环遍历列名称的向量
  2. 如果子串&#34; exp _&#34;在colnames vector == TRUE
  3. 的第i个元素中
  4. 在数据集中创建一个新列,该列是colnames向量的第i个元素除以引用类别(pupils),以及&#34; _pp&#34;附在最后
  5. 别无所事
  6. 我想,因为我的代码执行没有错误,但没有做任何我的问题在if()语句中,但我无法弄清楚我做错了什么。我也尝试添加&#34; == TRUE&#34;在if()语句中但实现了相同的结果。

3 个答案:

答案 0 :(得分:2)

几乎正确,你没有定义循环的长度,所以什么也没发生。试试这个:

for (i in 1:length(colnames(test))) {
  if(grepl("exp_", colnames(test)[i])) {
  test[paste(i,"pp", sep="_")] <- test[i] / test$pupils
  }
}

答案 1 :(得分:2)

作为@ timfaber答案的替代方案,您可以保持第一行相同但不将i视为索引:

for (i in colnames(test)) {
  if(grepl("exp_", i)) {
    print(i)
    test[paste(i,"pp", sep="_")] <- test[i] / test$pupils
  }
}

答案 2 :(得分:1)

线性解决方案:

不要使用循环!您可以线性化代码并以比循环列更快的速度运行它。以下是如何做到这一点:

Max([FinalOutput])