循环,根据条件创建新变量作为现有变量的函数

cpa*_*ong 5 for-loop r grepl

我有一些数据包含 400 多个列和大约 80 个观察值。我想使用 for 循环来遍历每一列,如果它包含所需的 prefix exp_,我想创建一个新列,该新列是该值除以参考列,存储为相同的名称但带有后缀_pp。我还想用其他前缀做一个 else if 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
Run Code Online (Sandbox Code Playgroud)

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

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

我对这是做什么的理解:

  1. 循环遍历列名向量
  2. 如果子字符串“exp_”位于 colnames 向量的第 i 个元素中 == TRUE
  3. 在数据集中创建一个新列,该列是 colnames 向量的第 i 个元素除以参考类别(学生),并在末尾附加“_pp”
  4. 否则什么都不做

我想,因为我的代码执行时没有错误,但没有做任何事情,所以我的问题出在 if() 语句中,但我无法弄清楚我做错了什么。我还尝试在 if() 语句中添加“==TRUE”,但取得了相同的结果。

tim*_*ber 3

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

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