Проблемы с разделением фрейма данных на вложенный список - PullRequest
1 голос
/ 30 августа 2011

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

У меня есть упрощенный пример организации моих данных:

Заголовки:

1 "station" (number)
2. "date.str" (date string)
3. "member"
4. "forecast time"
5. "data"

Я не уверен, что мой пример данных будет отображаться правильно, но если это так, он выглядит так:

1. station date.str member forecast.time data1
2. 6019 20110805 mbr000 06 77
3. 6031 20110805 mbr000 06 28
4. 6071 20110805 mbr000 06 45
5. 6019 20110805 mbr001 12 22
6. 6019 20110806 mbr024 18 66

Я хочу разбить большой фрейм данных на вложенный список после "station", "member", "date.str" и "forecast.time". Так что mylist [[c (s, m, d, t)]] содержит фрейм данных с данными для станции "s" и члена "m" для date.str "d" и для прогнозируемого времени "t", сохраняющего значения из с, м, д и т.

Мой код:

data.st <- list()
data.st.member <- list()
data.st.member.dato <- list()

data.st. <- split(mydata, mydata$station)
data.st.member <- lapply(data.st, FUN = fsplit.member)

(я создал функцию для разделения после "члена")

#Loop over station number:
for (s in 1:S){

#Loop over members:
for (m in 1:length(members){
tmp <- split( data.st.member[[s]][[m]], data.st.member[[s]][[m]]$dato.str )

#Loop over number of different "date.str"s
for (t in 1:length(no.date.str) ){
data.st.member.dato[[s]][[m]][[t]] <- tmp}
} #end m loop
} #end s loop

Я также хотел бы разделить в соответствии с прогнозом времени: forec.time, но я не получил это далеко.

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

Любая помощь очень ценится!

С уважением Sisse

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Я также хочу присоединиться к другим в том, что с этой рекурсивной структурой данных будет трудно работать, и, возможно, есть более эффективные способы. Посмотрите на подход «разделить-применить-объединить», как предложил Ричи. Тем не менее, ограничения могут быть внешними, поэтому вот ответ с использованием библиотеки plyr.

mylist <- dlply(mydata, .(station), dlply, .(memeber), dlply, .(date.str), dlply, .(forecast.time), identity)

Использование фрагмента данных, которые вы дали для mydata,

> mylist[[c("6019","mbr000","20110805","6")]]
  station date.str member forecast.time data1
1    6019 20110805 mbr000             6    77
1 голос
/ 30 августа 2011

Это проще, чем вы думаете. Вы можете передать список в split, чтобы разделить его на несколько факторов.

Воспроизводимый пример

with(airquality, split(airquality, list(Month, Day)))

С вашими данными

data.st <- with(mydata, 
  split(mydata, list("station", "member", "date.str", "forecast.time"))
)

Примечание. Это не дает вам вложенный список, как вы просили, но, как прокомментировал Джоран, вы, скорее всего, этого не захотите. С плоским списком будет удобнее работать.

Дико размышляя: вы просто хотели рассчитать статистику по разным кускам данных? Если это так, то см. Здесь множество вопросов по split-apply-Объединить проблемы.

...