r - 列表、数据框循环和索引问题

标签 r list for-loop dataframe

我有一些 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)

另请查看 applylapplysapplyifelse 等。另请注意,许多函数都是矢量化并且可以轻松地在矢量上工作。

如果你真的想修复你所拥有的东西,你可以使用以下内容:

 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/

相关文章:

c++ - 为什么在为数组分配新值时会崩溃?

c# - 如何从 C# 字符串中按名称查找文本框控件?

c++ - 在 C++ 中使用模板测试字符串或其他数据类型数组

r - 更改vistime中的字体

在 R/shiny 中使用 renderTmap 时的 react 性问题

c# - 对两个 List<SelectListItem> 进行正确的并集

list - Haskell : Map and Zip A List

r - 查找重复行的索引

r - 将手动添加的行包含到 ggplot2 指南图例中

python - 按照字典中键之一的值的顺序对字典列表进行排序