我是一名学习R的SAS程序员。
我从csv文件中读取矩阵应收款。
如果行的“id”列值>> = 1100000000,我希望读取“transit”列中的值。
我这样做了(循环1):
x = vector()
for (i in 1:length(receivables[,"transit"])){
if(receivables[i,"id"] >= 1100000000){
append(x, receivables[i,"transit"]);
}
}
但是,它不起作用,因为在运行循环后x仍然是空的。
&X的催化剂
逻辑(0)
然而,我能够完成我的任务(循环2):
k=0
x=vector()
for (i in 1:length(receivables[,"transit"])){
if(receivables[i,"id"] >= 1100000000){
k=k+1
x[k] = receivables[i,"transit"]
}
}
或者,(循环3):
x = vector()
for (i in 1:length(receivables[,"transit"])){
if(receivables[i,"id"] >= 1100000000){
x <- append(x, receivables[i,"transit"]);
}
}
为什么append函数在循环中不像在命令行中那样工作?
实际上,教我如何捕鱼,在循环中操作函数时必须记住的态度/态度是什么,而不是在命令行中操作它们。
哪个效率更高?循环2或循环3?
答案 0 :(得分:4)
好的,有些事情。
append
在您第一次尝试时无效,因为您没有将结果分配给任何内容。一般来说,R不起作用“到位”。它更像是一种功能语言,这意味着必须始终将更改分配给某些内容。 (也有例外,但是过早地试图弯曲这个规则会让你遇到麻烦。)
更重要的一点是,R中“增长”的物体是一个很大的禁忌。你会很快开始想知道为什么任何人都可以使用R,因为像这样的增长对象会很快变得非常非常慢。
相反,学会使用矢量化操作,例如:
receivables[receivables[,"id"] >= 1100000000,"transit"]