data.frame из списка и вызов объекта из строки - PullRequest
2 голосов
/ 29 октября 2011

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

Так вот мой код:

library(fBasics)

url= 'http://faculty.chicagobooth.edu/ruey.tsay/teaching/fts3/d-ibm3dx7008.txt'

table1.2 = read.table(url,header=T)
l1=lapply(table1.2,basicStats)
naml1 = names(l1)
datmat = as.data.frame(matrix(0,nrow=nrow(l1$Date),ncol=4))

nams = names(l1)
j=1

for( i in nams){
 datmat[,j] = eval(parse(text=paste("l1",i,sep="$")))
 j=j+1
  }

rownames(datmat)= rownames(l1[[1]])
colnames(datmat)=colnames(table1.2)

Меня не волнует сводная статистика по дате, поэтому просто избавьтесь от нее.

datmat =datmat[,-1]

Итак, я слышал, что eval (parse (text =) следует избегать, насколько это возможно. Я пытался использовать функцию get, но не работал.

Я просто пытаюсь избавиться от плохих практик программирования, поэтому любые советы приветствуются.

Ответы [ 4 ]

7 голосов
/ 30 октября 2011

Зачем все это переживать. похоже, вы делаете то, что уже выполняет функция basicStats. Это кажется слишком простым, чтобы быть правым, но я думаю, что следующее дает вам тот же результат:

basicStats(table1.2)[,-1]
0 голосов
/ 29 октября 2011

Вы можете просто добавить это после того, как получите l1

datmat  <- setNames(as.data.frame(l1), names(l1))

Более простой подход - использовать функцию describe в пакете psych

psych::describe(table1.2)
0 голосов
/ 30 октября 2011

Вы можете легко получить список векторов равной длины в data.frame, а затем просто изменить имена

> df.stats <- as.data.frame(lapply(table1.2,basicStats)[-1])
Warning message:
In sum(X) : Integer overflow - use sum(as.numeric(.))
> names(df.stats) <- names(table1.2)[-1]
> str(df.stats)
'data.frame':   16 obs. of  4 variables:
 $ rtn   : num  9.84e+03 0.00 -2.30e-01 1.32e-01 -8.57e-03 ...
 $ vwretd: num  9.84e+03 0.00 -1.71e-01 1.15e-01 -4.25e-03 ...
 $ ewretd: num  9.84e+03 0.00 -1.04e-01 1.07e-01 -2.57e-03 ...
 $ sprtr: num  9.84e+03 0.00 -2.05e-01 1.16e-01 -4.87e-03 ...

Заканчивается точно так же, как вы построили.

0 голосов
/ 29 октября 2011

Добро пожаловать в SO, я пытался выяснить, что вы хотите сделать, но кроме чтения вашего набора данных, я не мог получить то, что вы хотите сделать. Тем не менее, я пытаюсь придумать несколько советов. Может быть, я мог бы помочь немного дальше, если бы вы отредактировали свой пост и стали немного более точными.

  1. Используйте <- вместо = при назначении переменных. Это R способ сделать это. </li>
  2. Если вы еще не используете RStudio , найдите его, он вам очень поможет, так как имеет хорошее автозаполнение и хорошую интеграцию справки. (вы можете использовать alt + -, чтобы получить <- в rstudio, чтобы помочь вам привыкнуть к нему) </li>
  3. R - векторизованный язык, часто вам не нужны циклы, например: paste(l1,nams,sep="$") работает без цикла.
  4. Вы уже используете lapply, это хорошо. Часто бывает полезно написать функцию, а затем объединить эту собственную функцию с lapply и использовать ее в наших данных.
  5. Это действительно стоит прочитать некоторые из лучших введений, или также просмотреть более продвинутые ресурсы - даже если они не охватывают вашу конкретную проблему. Не торопитесь, чтобы это сделать, оно того стоит.

    Вот связанное обсуждение перекрестной проверки (сайт статистики stackexchange)

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