列表,data.frame循环&索引问题

时间:2012-03-13 02:48:04

标签: 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中的循环是一个标志,你不知道自己在做什么,但替代方案的学习曲线似乎很陡峭。这也是脚本运行惊人长时间的原因,即使在快速机器上也是如此。

2 个答案:

答案 0 :(得分:3)

问题是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)

答案 1 :(得分:2)

请注意以下结果

row.names(result) <- 1:nrow(result)
result

i <- 1:5
i * 5.3
i

正如你所看到的那样......用你的方式写R并不像python,尽管它可能像numpy。它具有与numpy类似的属性,因为向量上的数学命令会自动传播到所有。它也像numpy,因为它并不适用于所有事情。