我有一些python和numpy经验,但之前从未使用过R。我正试图用她的R项目来帮助我的妻子,因为尽管她对统计学有了更好的把握,但她的编程经验很少。我发现R的语法和文档非常令人困惑。
我们想做的最初的事情是循环遍历一个大型的data.frame,做一系列涉及先前和后续记录的空间计算,对数据进行一点点触发和一些质量检查,并用数据生成一个新对象。然后我们将这些新数据导入GIS
修改 为了清楚起见,这个例子中的计算只是一个占位符,并不像我需要做的实际计算。
最初我尝试过这样的事情:
> result = list()
> for (i in 1:5) {
+ #Calculate some dummy data. The actual calculations are much more involved
+ param1 = i * 1.1
+ param2 = i * 5.3
+ param3 = i + a_value
+ # Now append these calculated values to some sort of object
+ sample = list(param1=param1,param2=param2,param3=param3)
+ result <- rbind(result,sample)
+ }
> print(result)
param1 param2 param3
sample 1.1 5.3 12
sample 2.2 10.6 13
sample 3.3 15.9 14
sample 4.4 21.2 15
sample 5.5 26.5 16
“样本”列似乎没有必要,但是哦,它看起来不错。现在引用一个列...
> result$param2
NULL
我尝试通过以下方式摆脱'样本':
+ result <- rbind(result,list(param1=param1,param2=param2,param3=param3))
>
param1 param2 param3
[1,] 1.1 5.3 12
[2,] 2.2 10.6 13
[3,] 3.3 15.9 14
[4,] 4.4 21.2 15
[5,] 5.5 26.5 16
> result$param2
NULL
也许这个数据框的东西会起作用。我将第一行更改为:
result = data.frame()
>
param1 param2 param3
2 1.1 5.3 12
21 2.2 10.6 13
3 3.3 15.9 14
4 4.4 21.2 15
5 5.5 26.5 16
> result$param2 # One column
[1] 5.3 10.6 15.9 21.2 26.5
> result[2,] #One row
param1 param2 param3
21 2.2 10.6 13
> result[3,]$param3 # Single value
[1] 14
所以它有效,但我不确定21(行号?)是什么。如果我有更多行,则第21行是'211'。
有人能告诉我为什么第一个案例不起作用,'21'是什么意思,以及是否有更好的方法来做到这一点。我读过的大部分内容都表明R中的循环是一个标志,你不知道自己在做什么,但替代方案的学习曲线似乎很陡峭。这也是脚本运行惊人长时间的原因,即使在快速机器上也是如此。
答案 0 :(得分:3)
问题是R的工作方式与其他编程语言截然不同。使用循环通常不是很快。而是使用使R易于使用的矢量化(但与其他语言不同)。所以对于你的问题,我可能会这样做:
i=1:5
data.frame(param1 = i * 1.1, param2 = i * 5.3, param3 = i*2+9)
同时查看apply
,lapply
,sapply
,ifelse
等。另请注意,许多功能都是矢量化的,可以在矢量上轻松运行。
如果您真的想要修改所拥有的内容,可以使用以下内容:
result = list()
for (i in 1:5) {
#Calculate some dummy data. The actual calculations are much more involved
param1 = i * 1.1
param2 = i * 5.3
param3 = 2*i+9
# Now append these calculated values to some sort of object
sample = list(param1=param1,param2=param2,param3=param3)
result <- data.frame(rbind(result,sample))
rownames(result) <- 1:nrow(result)
}
print(result)
答案 1 :(得分:2)
请注意以下结果
row.names(result) <- 1:nrow(result)
result
i <- 1:5
i * 5.3
i
正如你所看到的那样......用你的方式写R并不像python,尽管它可能像numpy。它具有与numpy类似的属性,因为向量上的数学命令会自动传播到所有。它也像numpy,因为它并不适用于所有事情。