代码之家  ›  专栏  ›  技术社区  ›  Laura

用dplyr中的list元素创建一个dataframe

  •  5
  • Laura  · 技术社区  · 6 年前

    这是我的数据帧:

        df<-list(structure(list(Col1 = structure(1:6, .Label = c("A", "B", 
    "C", "D", "E", "F"), class = "factor"), Col2 = structure(c(1L, 
    2L, 3L, 2L, 4L, 5L), .Label = c("B", "C", "D", "F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L)), structure(list(Col1 = structure(c(1L, 4L, 5L, 6L, 2L, 
    3L), .Label = c("A", "E", "H", "M", "N", "P"), class = "factor"), 
        Col2 = structure(c(1L, 2L, 3L, 2L, 4L, 5L), .Label = c("B", 
        "C", "D", "F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L)), structure(list(Col1 = structure(c(1L, 4L, 6L, 5L, 2L, 
    3L), .Label = c("A", "W", "H", "M", "T", "U"), class = "factor"), 
        Col2 = structure(c(1L, 2L, 3L, 2L, 4L, 5L), .Label = c("B", 
        "C", "D", "S", "G"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L))) 
    

    我想提取col1= df[[1]][1] 作为数据帧。然后这个列表的第二个位置的col1我要合并到 测向[[1]][1] ,那么我将有一个包含2列的数据帧。 在这之后,我想把列表第三个位置的第1列合并到有两列的dataframe,然后我将有一个有3列的dataframe。

    换句话说,我的数据帧应该有3列,即列表中每个条目的所有第一列。

    dplyr包可以帮我做这个吗?

    有什么帮助吗?

    5 回复  |  直到 6 年前
        1
  •  5
  •   Rui Barradas    6 年前

    lapply 提取名为 "Col1 一气呵成。然后设置结果的名称。

    col1 <- as.data.frame(lapply(df, '[[', "Col1"))
    names(col1) <- letters[seq_along(col1)]
    
    col1
    #  a b c
    #1 A A A
    #2 B M M
    #3 C N U
    #4 D P T
    #5 E E W
    #6 F H H
    

    选择您可能会发现更好的任何其他列名。

    dplyr 可能是这样的

    df %>% 
      unlist(recursive = FALSE) %>%
      as.data.frame %>%
      select(., starts_with("Col1"))
    #  Col1 Col1.1 Col1.2
    #1    A      A      A
    #2    B      M      M
    #3    C      N      U
    #4    D      P      T
    #5    E      E      W
    #6    F      H      H
    
        2
  •  5
  •   acylam    6 年前

    map_dfc purrr

    library(purrr)
    
    map_dfc(df, `[`, 1)
    

    输出:

      Col1 Col11 Col12
    1    A     A     A
    2    B     M     M
    3    C     N     U
    4    D     P     T
    5    E     E     W
    6    F     H     H
    
        3
  •  2
  •   Calum You    6 年前

    替代使用 map_dfc 利用 purrr 的简明元素提取语法,允许按名称或位置指定元素的元素。例如,第一种方法相当于

    map_dfc(df, `[[`, 1)
    

    这与 [ 因为这些列不会被命名为 Col1 V 取而代之的是名字,因为名字像 Col11 Col12 可能会让人困惑。

    df <- list(structure(list(Col1 = structure(1:6, .Label = c("A", "B", "C", "D", "E", "F"), class = "factor"), Col2 = structure(c(1L, 2L, 3L, 2L, 4L, 5L), .Label = c("B", "C", "D", "F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, -6L)), structure(list(Col1 = structure(c(1L, 4L, 5L, 6L, 2L, 3L), .Label = c("A", "E", "H", "M", "N", "P"), class = "factor"), Col2 = structure(c(1L, 2L, 3L, 2L, 4L, 5L), .Label = c("B", "C", "D", "F", "G"), class = "factor")), class = "data.frame", row.names = c(NA, -6L)), structure(list(Col1 = structure(c(1L, 4L, 6L, 5L, 2L, 3L), .Label = c("A", "W", "H", "M", "T", "U"), class = "factor"), Col2 = structure(c(1L, 2L, 3L, 2L, 4L, 5L), .Label = c("B", "C", "D", "S", "G"), class = "factor")), class = "data.frame", row.names = c(NA, -6L)))
    
    library(purrr)
    map_dfc(df, 1)
    #> # A tibble: 6 x 3
    #>   V1    V2    V3   
    #>   <fct> <fct> <fct>
    #> 1 A     A     A    
    #> 2 B     M     M    
    #> 3 C     N     U    
    #> 4 D     P     T    
    #> 5 E     E     W    
    #> 6 F     H     H
    map_dfc(df, "Col1")
    #> # A tibble: 6 x 3
    #>   V1    V2    V3   
    #>   <fct> <fct> <fct>
    #> 1 A     A     A    
    #> 2 B     M     M    
    #> 3 C     N     U    
    #> 4 D     P     T    
    #> 5 E     E     W    
    #> 6 F     H     H
    

    创建日期:2018-09-19 reprex package (第0.2.0版)。

        4
  •  1
  •   Sal-laS    6 年前
    res<-1:nrow(df[[1]][1])
    
    for(i in 1:length(df)){
      print ( as.vector(df[[i]][1]))
      res<-cbind(res,as.data.frame(df[[i]][1]))
    }
    res$res<-NULL
    

    所以,输出是:

      Col1 Col1 Col1
    1    A    A    A
    2    B    M    M
    3    C    N    U
    4    D    P    T
    5    E    E    W
    6    F    H    H
    
        5
  •  0
  •   Chriss Paul    6 年前

    使用 dplyr

    library(dplyr)
    df %>% 
      sapply('[[',1) %>%
      as.data.frame
    #returns
      V1 V2 V3
    1  A  A  A
    2  B  M  M
    3  C  N  U
    4  D  P  T
    5  E  E  W
    6  F  H  H