списки, циклы data.frame и вопросы индексации - PullRequest
2 голосов
/ 13 марта 2012

У меня есть некоторый опыт работы с Python и NumPy, но я никогда не использовал R раньше. Я пытаюсь помочь моей жене с ее проектом R, поскольку, хотя она гораздо лучше разбирается в статистике, у нее мало опыта программирования. Я нахожу синтаксис и документацию R очень запутанными.

Первоначально мы хотели сделать цикл по большому объему data.frame, выполнить ряд пространственных вычислений, включающих предыдущие и последующие записи, небольшую проверку и некоторые проверки качества данных и создать новый объект с данными. Затем мы получим эти новые данные в ГИС


EDIT: Просто чтобы прояснить, вычисления в этом примере - просто заполнитель, и они не похожи на реальные вычисления, которые мне нужно было сделать.


Первоначально я пытался что-то вроде этого:

> 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

Столбец "sample" кажется ненужным, ну да ладно, выглядит хорошо. Теперь для ссылки на один столбец ...

> result$param2
NULL

??? Я пытался избавиться от 'sample' с помощью:

+   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 ]

3 голосов
/ 13 марта 2012

Проблема в том, что 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)
2 голосов
/ 13 марта 2012

Обратите внимание на результаты следующего

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

i <- 1:5
i * 5.3
i

Как вы можете видеть ... запись в R не похожа на python, как вы его используете, хотя она может быть похожа на numpy.Он имеет свойства, аналогичные numpy, в том, что математические команды для векторов автоматически распространяются на всех.Это также похоже на то, что это не работает для всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...