Сформируйте новые фреймы данных из списка, объединив аналогичные записи во всех фреймах данных.

У меня есть список со многими кадрами данных (пример приведен ниже).

    G100=structure(list(Return.Period = structure(c(4L, 6L, 2L, 3L, 5L, 
        1L), .Label = c("100yrs", "10yrs", "20yrs", "2yrs", "50yrs", 
        "5yrs"), class = "factor"), X95..lower.CI = c(54.3488053692529, 
        73.33363378538, 84.0868168935697, 91.6191228597281, 96.3360349026068, 
        95.4278817251266), Estimate = c(61.6857930414643, 84.8210149260708, 
        101.483909733627, 118.735593472652, 143.33257990536, 163.806035490329
        ), X95..upper.CI = c(69.0227807136758, 96.3083960667617, 118.881002573685, 
        145.852064085577, 190.329124908114, 232.18418925553)), .Names = c("Return.Period", 
        "X95..lower.CI", "Estimate", "X95..upper.CI"), row.names = c(NA, 
        -6L), class = "data.frame")

G101<-G100 # just for illustration

mylist=list(G100,G101) # there 100 of these with differet codes

имена (mylist) представляют «САЙТ». Из каждого кадра данных я хотел бы взять «Оценку» и сформировать новый кадр данных, который выглядит так (не точно, потому что значения не одинаковы для всех dfs): Estimate<-

SITE    X2yrs    X5yrs   X10yrs   X20yrs   X50yrs X100yrs
G100 61.68579 84.82101 101.4839 118.7356 143.3326 163.806
G101 61.68579 84.82101 101.4839 118.7356 143.3326 163.806

Обратите внимание, что SITE совпадает с именами фреймов данных в mylist.

Сделайте то же самое для "X95..lower.CI" и "X95..upper.CI".

Итак, я получу 3 фрейма данных "Estimate","X95..lower.CI"и"X95..upper.CI". с приведенным выше макетом.

#lapply, rbindlist,cbind and others can do but how?

Предложения, пожалуйста.


person code123    schedule 11.03.2015    source источник


Ответы (1)


Просто используйте цикл for, чтобы добавить имена. Вероятно, есть причудливый *apply способ, но for его легко использовать, запомнить и понять.

Начните с добавления имен:

names(mylist) = paste0("G", seq(from = 100, by = 1, length.out = length(mylist)))

Добавьте столбец SITE, как и раньше:

for (i in seq_along(mylist)) {
    mylist[[i]]$SITE = names(mylist)[i]
}

Объединить фреймы данных:

Поскольку у вас много фреймов данных или они довольно большие, используйте dplyr::rbind_all для скорости. (В базе R do.call(rbind, mylist) будет работать, но медленнее.)

library(dplyr)
combined = bind_rows(mylist)

(В более ранних версиях dplyr можно использовать rbind_all вместо bind_rows, но это скоро станет устаревшим: (https://github.com/hadley/dplyr/issues/803).)

Преобразуйте столбцы Estimate и CI из длинных в широкие.

Это легко сделать с помощью tidyr, хотя reshape2::dcast работает аналогично:

library(tidyr)
Estimate = combined %>% select(SITE, Return.Period, Estimate) %>%
    spread(key = Return.Period, value = Estimate)
head(Estimate)
# Source: local data frame [2 x 7]
#
#   SITE  100yrs    10yrs    20yrs     2yrs    50yrs     5yrs
# 1 G100 163.806 101.4839 118.7356 61.68579 143.3326 84.82101
# 2 G101 163.806 101.4839 118.7356 61.68579 143.3326 84.82101    

Lower95 = combined %>% select(SITE, Return.Period, X95..lower.CI) %>%
    spread(key = Return.Period, value = X95..lower.CI)
head(Lower95)
# Source: local data frame [2 x 7]
#
#   SITE   100yrs    10yrs    20yrs     2yrs    50yrs     5yrs
# 1 G100 95.42788 84.08682 91.61912 54.34881 96.33603 73.33363
# 2 G101 95.42788 84.08682 91.61912 54.34881 96.33603 73.33363

Возможно, вы захотите изменить порядок столбцов не в алфавитном порядке.

Сделайте то же самое для ``"X95..upper.CI"`.

Все еще оставлено в качестве упражнения для читателя.

person Gregor Thomas    schedule 11.03.2015
comment
если я использую описанный выше цикл для mylist, кадры данных будут помечены как [[1]] и [[2]], но я хочу [[G100]] и [[G101]]. Помните, у меня есть ›100 таких файлов. Во-вторых, не просто объединяйте фреймы данных, как вы предлагаете, но Estimate, X95..lower.CI и X95..upper.CI FINAL фреймы данных должны быть такими, как указано выше. По сути, я хотел бы перейти к каждому кадру данных и для "Estimate" извлечь X2yrs X5yrs X10yrs X20yrs X50yrs X100yrs и сформировать таблицу, как показано выше. Сделайте то же самое для "X95..lower.CI" and "X95..upper.CI". Мой результат будет 3 фрейма данных. - person code123; 11.03.2015