我有一些数据包含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)
}
}
我对这是做什么的理解:
我想,因为我的代码执行没有错误,但没有做任何我的问题在if()语句中,但我无法弄清楚我做错了什么。我也尝试添加&#34; == TRUE&#34;在if()语句中但实现了相同的结果。
答案 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])