我有一些包含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)
  }
}


我对此的理解:


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


我可以想象,由于我的代码正在执行而没有错误,但是没有执行任何操作,这是我的问题在if()语句中的原因,但是我无法弄清楚自己在做什么错。我还尝试在if()语句中添加“ == TRUE”,但达到了相同的结果。

最佳答案

几乎正确,您没有定义循环的长度,因此没有任何反应。试试这个:

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

07-24 09:52
查看更多