транспонирование строк и столбцов в нескольких фреймах данных в списке - PullRequest
1 голос
/ 24 апреля 2020

У меня есть несколько фреймов данных в списке. Я хочу применить эту функцию к каждому фрейму данных.

    df = data.frame(x = c("P1","P2","P3","P4","P5"),
                y = c("DC","DC","DC","DC","DC"),
                f_1 = c("NA","1","NA","NA","NA"), 
                f_2= c("NA","1","NA","NA","NA"),
                f_3= c("1","7","NA","NA","NA"),
                f_4= c("NA","NA","5","NA","NA"),
                f_5= c("NA","NA","2","NA","NA"),
                stringsAsFactors = FALSE)

df1 = data.frame(x = c("P1","P8","P10","P4","P11"),
                 y = c("RC","RC","RC","RC","RC"),
                f_1 = c("5","1","NA","NA","NA"), 
                f_2= c("NA","1","7","NA","NA"),
                f_3= c("1","7","NA","9","NA"),
                f_4= c("NA","NA","5","NA","NA"),
                f_5= c("NA","NA","2","NA","10"),
                stringsAsFactors = FALSE)

df2 = data.frame(x = c("P11","P22","P23","P44","P25"),
                 y = c("PC","PC","PC","PC","PC"),
                f_1 = c("NA","1","2","NA","6"), 
                f_2= c("NA","1","NA","NA","NA"),
                f_3= c("1","7","NA","NA","NA"),
                f_4= c("NA","3","5","NA","NA"),
                f_5= c("5","NA","2","NA","NA"),
                stringsAsFactors = FALSE)

DF<-list(df,df1,df2)

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

Я попытался, но не получил правильный вывод. Я также попытался собрать функцию, но не удалось.

lapply(DF,function(x){
  t(x)[,c(2:6)]})

Desire output:  



 DF[[1]]

    x   y    F
    P1  DC   NA 
    P2  DC   1 
    P3  DC   NA
    P4  DC   10
    P5  DC   NA
    P1  DC   NA
    P2..DC   1 

Кто-нибудь знает ??

1 Ответ

0 голосов
/ 24 апреля 2020

Мы можем использовать pivot_longer после зацикливания list с map

library(dplyr)
library(tidyr)
library(purrr)
map(DF, ~ .x %>%
             pivot_longer(cols = starts_with('f'), values_to = "F") %>% 
            select(-name))
#[[1]]
# A tibble: 25 x 3
#   x     y     F    
#   <chr> <chr> <chr>
# 1 P1    DC    NA   
# 2 P1    DC    NA   
# 3 P1    DC    1    
# 4 P1    DC    NA   
# 5 P1    DC    NA   
# 6 P2    DC    1    
# 7 P2    DC    1    
# 8 P2    DC    7    
# 9 P2    DC    NA   
#10 P2    DC    NA   
# … with 15 more rows

#[[2]]
# A tibble: 25 x 3
#   x     y     F    
#   <chr> <chr> <chr>
# 1 P1    RC    5    
# 2 P1    RC    NA   
# 3 P1    RC    1    
# 4 P1    RC    NA   
# 5 P1    RC    NA   
# 6 P8    RC    1    
# 7 P8    RC    1    
# 8 P8    RC    7    
# 9 P8    RC    NA   
#10 P8    RC    NA   
# … with 15 more rows

#[[3]]
# A tibble: 25 x 3
#   x     y     F    
#   <chr> <chr> <chr>
# 1 P11   PC    NA   
# 2 P11   PC    NA   
# 3 P11   PC    1    
# 4 P11   PC    NA   
# 5 P11   PC    5    
# 6 P22   PC    1    
# 7 P22   PC    1    
# 8 P22   PC    7    
# 9 P22   PC    3    
#10 P22   PC    NA   
# … with 15 more rows

Если у нас нет одинаковых имен столбцов в list, тогда мы можем использовать индекс

map(DF, ~ .x %>%
         pivot_longer(cols = 3:ncol(.), values_to = "F") %>% 
        select(-name))
...