Как извлечь и объединить строки из фреймов данных в списке в R - PullRequest
1 голос
/ 01 апреля 2020

Мои реальные данные размещены в большом списке из 95 кадров данных. Каждый фрейм данных имеет тысячи строк и 8 столбцов. Чтобы быть проще и понятнее, я создал эти аналогичные объекты с фиктивными данными.

state <- c("MG", "SP", "PR")
individual <- c("ind1", "ind2", "ind3")
sample <- c("a", "b", "c")

df1 <- data.frame(var1, state, individual, sample)
df2 <- data.frame(var1, state, individual, sample)
df3 <- data.frame(var1, state, individual, sample)

df_total <- list(df1, df2, df3)

names(df_total) <- c("df1", "df2", "df3")

df_total

#> df_total
#$df1
#        var1 state individual sample
#1  0.3898432    MG       ind1      a
#2 -0.6212406    SP       ind2      b
#3 -2.2146999    PR       ind3      c
#
#$df2
#        var1 state individual sample
#1  0.3898432    MG       ind1      a
#2 -0.6212406    SP       ind2      b
#3 -2.2146999    PR       ind3      c
#
#$df3
#        var1 state individual sample
#1  0.3898432    MG       ind1      a
#2 -0.6212406    SP       ind2      b
#3 -2.2146999    PR       ind3      c

Все кадры данных идентичны по структуре и содержат информацию об одних и тех же лицах в разных контекстах.

Моя цель - иметь возможность извлекать и объединять строки из всех фреймов данных в новые фреймы данных, сохраняя заголовки столбцов.

Точнее, я хочу создать фрейм данных со всеми перечисленными строками. «Ind1» в столбце individual, одна со всеми строками, в которых упоминается «ind2» и т. Д. Поскольку в моих реальных данных содержится 95 разных людей, я хотел бы получить решение, которое зацикливается и создает фрейм данных для каждого отдельного имени, содержащегося в этом столбце, без их индивидуального вызова.

Это было несколько дней с тех пор, как я пытаюсь это сделать, используя dplyr и purrr, но с треском проваливаюсь ...

Есть предложения для новичка?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Мы можем использовать bind_rows с .id для создания столбца идентификатора с names из list, а затем group_split с «отдельным» столбцом

library(dplyr)
bind_rows(df_total, .id = 'grp')%>% 
        group_split(individual)
#[[1]]
# A tibble: 3 x 5
#   var1 state individual sample grp  
#  <dbl> <fct> <fct>      <fct>  <chr>
#1 0.390 MG    ind1       a      df1  
#2 0.390 MG    ind1       a      df2  
#3 0.390 MG    ind1       a      df3  

#[[2]]
# A tibble: 3 x 5
#    var1 state individual sample grp  
#   <dbl> <fct> <fct>      <fct>  <chr>
#1 -0.621 SP    ind2       b      df1  
#2 -0.621 SP    ind2       b      df2  
#3 -0.621 SP    ind2       b      df3  

#[[3]]
# A tibble: 3 x 5
#   var1 state individual sample grp  
#  <dbl> <fct> <fct>      <fct>  <chr>
#1 -2.21 PR    ind3       c      df1  
#2 -2.21 PR    ind3       c      df2  
#3 -2.21 PR    ind3       c      df3  
1 голос
/ 02 апреля 2020

Вот базовое решение R

res <- split(u<-do.call(rbind,df_total),u$individual)

такое, что

> res
$ind1
           var1 state individual sample
df1.1 0.3898432    MG       ind1      a
df2.1 0.3898432    MG       ind1      a
df3.1 0.3898432    MG       ind1      a

$ind2
            var1 state individual sample
df1.2 -0.6212406    SP       ind2      b
df2.2 -0.6212406    SP       ind2      b
df3.2 -0.6212406    SP       ind2      b

$ind3
         var1 state individual sample
df1.3 -2.2147    PR       ind3      c
df2.3 -2.2147    PR       ind3      c
df3.3 -2.2147    PR       ind3      c
1 голос
/ 02 апреля 2020
lapply(paste0("ind", 1:95), function(y){
  do.call('rbind', lapply(df_total, function(x) x[individual == y, ]))
} )

или

apply(do.call('rbind', lapply(df_total, function(x) split(x, x$individual))), 2, function(y) do.call('rbind', y))
# $ind1
#          var1 state individual sample
# df1 0.3898432    MG       ind1      a
# df2 0.3898432    MG       ind1      a
# df3 0.3898432    MG       ind1      a
# 
# $ind2
#           var1 state individual sample
# df1 -0.6212406    SP       ind2      b
# df2 -0.6212406    SP       ind2      b
# df3 -0.6212406    SP       ind2      b
# 
# $ind3
#        var1 state individual sample
# df1 -2.2147    PR       ind3      c
# df2 -2.2147    PR       ind3      c
# df3 -2.2147    PR       ind3      c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...