我有一些 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 中的循环表明您不知道自己在做什么,但替代方案的学习曲线似乎很陡峭。这也是为什么即使在快速机器上,脚本也需要令人惊讶很长的时间来运行。
最佳答案
问题是 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)
关于r - 列表、数据框循环和索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677737/