извлечение одного набора из нескольких переменных в списке data.frames в R - PullRequest
1 голос
/ 21 июня 2019

Предположим, у меня есть data.frame как ЭТО .Любые столбцы данных после столбца с именем autoreg являются произвольными столбцами, определенными пользователем.Так что я не буду знать названия или значения столбцов.Например, в ЭТОМ data.frame столбцы с именами: "ESL" "prof" "scope" "type" определяются пользователем.

Вопрос:

Как получить циклическую структуру (в BASE R), которая в каждом раунде извлекает один набор из каждого из этих произвольных столбцов? Мой желаемый результат - список, в котором ESL значения prof значения scope значения и type значения из каждого исследования помещены рядом друг с другом.

У меня естьпопробовал два вложенных lapply ( см. ниже ), который извлекает все значения для всех наборов этих произвольных столбцов, но как я могу извлечь по одному набору каждого из этих произвольных столбцов за раз?

D <- read.csv("https://raw.githubusercontent.com/izeh/i/master/i.csv", h = T) ## data.frame
L <- split(D, D$study.name) ; L[[1]] <- NULL

arb.names <- c("ESL", "prof", "scope", "type") ## arbitrary column names 

a <- lapply(1:length(arb.names), function(j) lapply(1:length(L), function(i) L[[i]][arb.names[j]]))

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Может быть, нам нужно grep 'arb.names', чтобы извлечь набор столбцов из 'L'

lapply(arb.names, function(nm) lapply(L, function(l1) l1[grep(nm, names(l1))]))

Если мы хотим сгруппировать разные имена поlist как один list, используйте transpose

library(purrr)
lapply(arb.names, function(nm) transpose(lapply(L, function(l1) l1[grep(nm, names(l1))])))

Или используйте base R

m1 <- simplify2array(lapply(arb.names, function(nm)
      lapply(L, function(l1) l1[grep(nm, names(l1))])))
split(m1, col(m1))
0 голосов
/ 21 июня 2019

Хотя на этот вопрос принят приемлемый ответ, я хотел бы предложить совершенно другой подход.

Если я правильно понимаю, ОП ищет способ легко сравнить значения в произвольных столбцах между различными исследованиями. В качестве дополнительной сложности имена произвольных столбцов заранее не известны.

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

library(data.table)
library(magrittr)
melt(setDT(D), id.vars = c("study.name", "group.name"), 
     measure.vars = tail(names(D), -grep("autoreg", names(D))), na.rm = TRUE) %>%
  dcast(variable + study.name ~ group.name)
    variable study.name Cont.Long Cont.Long2 Cont.Short DCF.Long DCF.Long2 DCF.Short ME.long ME.long2 ME.short
 1:      ESL  Ellis.sh1         1         NA          1        1        NA         1       1       NA        1
 2:      ESL      Goey1         0         NA          0        0        NA         0       0       NA        0
 3:      ESL      kabla         1          1          1        1         1         1       1        1        1
 4:     prof  Ellis.sh1         2         NA          2        2        NA         2       2       NA        2
 5:     prof      Goey1         1         NA          1        1        NA         1       1       NA        1
 6:     prof      kabla         3          3          3        3         3         3       3        3        3
 7:    scope  Ellis.sh1         0         NA          0        0        NA         0       0       NA        0
 8:    scope      Goey1         1         NA          1        1        NA         1       1       NA        1
 9:    scope      kabla         0          0          0        0         0         0       0        0        0
10:     type  Ellis.sh1         1         NA          1        1        NA         1       1       NA        1
11:     type      Goey1         0         NA          0        0        NA         0       0       NA        0
12:     type      kabla         1          1          1        1         1         1       1        1        1

В качестве произвольных столбцов (столбец variable в измененном формате) все столбцы выбираются из D, которые появляются после столбца autoreg независимо от их имен на

tail(names(D), -grep("autoreg", names(D)))

Добавление

Обратите внимание, что имена столбцов взяты из group.name и расположены в алфавитном порядке. Если требуется сохранить исходный порядок строк, в котором group.name появился в D, то уровни коэффициента group.name необходимо соответствующим образом скорректировать:

library(data.table)
library(magrittr)
lvls <- D[study.name != "", 1:2] %>% 
  split(drop = TRUE, by = "study.name") %>% 
  .[lengths(.) %>% order() %>% rev()] %>% # merge longest first
  Reduce(function(x, y) merge(x, y, by = "group.name", all = TRUE, sort = FALSE), .) %>% 
  .[, group.name %>% forcats::fct_drop() %>% forcats::fct_inorder()] 
melt(setDT(D), id.vars = c("study.name", "group.name"), 
     measure.vars = tail(names(D), -grep("autoreg", names(D))), na.rm = TRUE) %>%
  .[, group.name := factor(group.name, levels = lvls)] %>% 
  dcast(variable + study.name ~ group.name)
    variable study.name ME.short ME.long ME.long2 DCF.Short DCF.Long DCF.Long2 Cont.Short Cont.Long Cont.Long2
 1:      ESL  Ellis.sh1        1       1       NA         1        1        NA          1         1         NA
 2:      ESL      Goey1        0       0       NA         0        0        NA          0         0         NA
 3:      ESL      kabla        1       1        1         1        1         1          1         1          1
 4:     prof  Ellis.sh1        2       2       NA         2        2        NA          2         2         NA
 5:     prof      Goey1        1       1       NA         1        1        NA          1         1         NA
 6:     prof      kabla        3       3        3         3        3         3          3         3          3
 7:    scope  Ellis.sh1        0       0       NA         0        0        NA          0         0         NA
 8:    scope      Goey1        1       1       NA         1        1        NA          1         1         NA
 9:    scope      kabla        0       0        0         0        0         0          0         0          0
10:     type  Ellis.sh1        1       1       NA         1        1        NA          1         1         NA
11:     type      Goey1        0       0       NA         0        0        NA          0         0         NA
12:     type      kabla        1       1        1         1        1         1          1         1          1

Данные

Поскольку внешние ссылки в будущем могут прерваться, вот набор данных OP из ссылки github:

D <-
structure(list(study.name = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
1L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L), .Label = c("", "Ellis.sh1", "Goey1", "kabla"), class = "factor"), 
    group.name = structure(c(10L, 8L, 7L, 5L, 4L, 2L, 1L, 10L, 
    8L, 7L, 5L, 4L, 2L, 1L, 10L, 8L, 9L, 7L, 5L, 6L, 4L, 2L, 
    3L), .Label = c("", "Cont.Long", "Cont.Long2", "Cont.Short", 
    "DCF.Long", "DCF.Long2", "DCF.Short", "ME.long", "ME.long2", 
    "ME.short"), class = "factor"), n = c(13L, 13L, 15L, 15L, 
    16L, 16L, NA, 13L, 13L, 15L, 15L, 16L, 16L, NA, 13L, 13L, 
    13L, 15L, 15L, 15L, 16L, 16L, 16L), mpre = c(0.34, 0.34, 
    0.37, 0.37, 0.32, 0.32, NA, 0.34, 0.34, 0.37, 0.37, 0.32, 
    0.32, NA, 0.34, 0.34, 0.34, 0.37, 0.37, 0.37, 0.32, 0.32, 
    0.32), mpos = c(0.72, 0.39, 0.54, 0.49, 0.28, 0.35, NA, 0.72, 
    0.39, 0.54, 0.49, 0.28, 0.35, NA, 0.72, 0.39, 0.39, 0.54, 
    0.49, 0.49, 0.28, 0.35, 0.35), sdpre = c(0.37, 0.37, 0.38, 
    0.38, 0.37, 0.37, NA, 0.37, 0.37, 0.38, 0.38, 0.37, 0.37, 
    NA, 0.37, 0.37, 0.37, 0.38, 0.38, 0.38, 0.37, 0.37, 0.37), 
    sdpos = c(0.34, 0.36, 0.36, 0.36, 0.36, 0.32, NA, 0.34, 0.36, 
    0.36, 0.36, 0.36, 0.32, NA, 0.34, 0.36, 0.36, 0.36, 0.36, 
    0.36, 0.36, 0.32, 0.32), control = c(FALSE, FALSE, FALSE, 
    FALSE, TRUE, TRUE, NA, FALSE, FALSE, FALSE, FALSE, TRUE, 
    TRUE, NA, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, 
    TRUE, TRUE), post = c(1L, 2L, 1L, 2L, 1L, 2L, NA, 1L, 2L, 
    1L, 2L, 1L, 2L, NA, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), 
    r = c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5, NA, 0.5, 0.5, 0.5, 0.5, 
    0.5, 0.5, NA, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5
    ), autoreg = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    NA, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NA, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 
    ESL = c(1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L, 0L, 0L, 0L, 
    NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), prof = c(2L, 2L, 
    2L, 2L, 2L, 2L, NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L), scope = c(0L, 0L, 0L, 0L, 0L, 0L, 
    NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L), type = c(1L, 1L, 1L, 1L, 1L, 1L, NA, 0L, 0L, 0L, 
    0L, 0L, 0L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-23L))
    study.name group.name  n mpre mpos sdpre sdpos control post   r autoreg ESL prof scope type
 1:  Ellis.sh1   ME.short 13 0.34 0.72  0.37  0.34   FALSE    1 0.5   FALSE   1    2     0    1
 2:  Ellis.sh1    ME.long 13 0.34 0.39  0.37  0.36   FALSE    2 0.5   FALSE   1    2     0    1
 3:  Ellis.sh1  DCF.Short 15 0.37 0.54  0.38  0.36   FALSE    1 0.5   FALSE   1    2     0    1
 4:  Ellis.sh1   DCF.Long 15 0.37 0.49  0.38  0.36   FALSE    2 0.5   FALSE   1    2     0    1
 5:  Ellis.sh1 Cont.Short 16 0.32 0.28  0.37  0.36    TRUE    1 0.5   FALSE   1    2     0    1
 6:  Ellis.sh1  Cont.Long 16 0.32 0.35  0.37  0.32    TRUE    2 0.5   FALSE   1    2     0    1
 7:                       NA   NA   NA    NA    NA      NA   NA  NA      NA  NA   NA    NA   NA
 8:      Goey1   ME.short 13 0.34 0.72  0.37  0.34   FALSE    1 0.5   FALSE   0    1     1    0
 9:      Goey1    ME.long 13 0.34 0.39  0.37  0.36   FALSE    2 0.5   FALSE   0    1     1    0
10:      Goey1  DCF.Short 15 0.37 0.54  0.38  0.36   FALSE    1 0.5   FALSE   0    1     1    0
11:      Goey1   DCF.Long 15 0.37 0.49  0.38  0.36   FALSE    2 0.5   FALSE   0    1     1    0
12:      Goey1 Cont.Short 16 0.32 0.28  0.37  0.36    TRUE    1 0.5   FALSE   0    1     1    0
13:      Goey1  Cont.Long 16 0.32 0.35  0.37  0.32    TRUE    2 0.5   FALSE   0    1     1    0
14:                       NA   NA   NA    NA    NA      NA   NA  NA      NA  NA   NA    NA   NA
15:      kabla   ME.short 13 0.34 0.72  0.37  0.34   FALSE    1 0.5   FALSE   1    3     0    1
16:      kabla    ME.long 13 0.34 0.39  0.37  0.36   FALSE    2 0.5   FALSE   1    3     0    1
17:      kabla   ME.long2 13 0.34 0.39  0.37  0.36   FALSE    3 0.5   FALSE   1    3     0    1
18:      kabla  DCF.Short 15 0.37 0.54  0.38  0.36   FALSE    1 0.5   FALSE   1    3     0    1
19:      kabla   DCF.Long 15 0.37 0.49  0.38  0.36   FALSE    2 0.5   FALSE   1    3     0    1
20:      kabla  DCF.Long2 15 0.37 0.49  0.38  0.36   FALSE    3 0.5   FALSE   1    3     0    1
21:      kabla Cont.Short 16 0.32 0.28  0.37  0.36    TRUE    1 0.5   FALSE   1    3     0    1
22:      kabla  Cont.Long 16 0.32 0.35  0.37  0.32    TRUE    2 0.5   FALSE   1    3     0    1
23:      kabla Cont.Long2 16 0.32 0.35  0.37  0.32    TRUE    3 0.5   FALSE   1    3     0    1
    study.name group.name  n mpre mpos sdpre sdpos control post   r autoreg ESL prof scope type
...