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