【问题标题】:R: select a column of a dataframe columnR:选择数据框列的一列
【发布时间】:2020-06-23 14:34:14
【问题描述】:

我尝试选择位于 data.frame 列中的列。 听起来很容易,但是,我不知所措..

library(tidyverse)

#test data
df <- tibble(name=c("a","b","c"),
            type=data.frame(motor=c(1,2,3),
            engine=c(1,2,3)),
            more=list(c(list(1,2,3),
                   list(2,3,4),
                   list(1,1,1))))

df
#> # A tibble: 3 x 3
#>   name  type$motor $engine more      
#>   <chr>      <dbl>   <dbl> <list>    
#> 1 a              1       1 <list [9]>
#> 2 b              2       2 <list [9]>
#> 3 c              3       3 <list [9]>

reprex package (v0.3.0) 于 2020 年 6 月 23 日创建

我想选择nameengine 列。

我尝试过这样的事情但没有成功:

df %>% select(name,$engine)

【问题讨论】:

    标签: r dataframe dplyr nested tidyverse


    【解决方案1】:

    因为您有一个未嵌套的框架(以及一个嵌套的列表列),所以默认视图会显示已分解的列。一种方法是transmute它出来:

    transmute(df, name, engine = type$engine)
    # # A tibble: 3 x 2
    #   name  engine
    #   <chr>  <dbl>
    # 1 a          1
    # 2 b          2
    # 3 c          3
    

    【讨论】:

      【解决方案2】:

      根据@RDRR 对此post 的回答,您可以构造一个自定义函数unnest_dataframes,在数据帧中迭代地取消嵌套数据帧。之后,您只需选择列type.enginetype,因为内部数据框是这样调用的),并将其重命名为engine

      unnest_dataframes <- function(x) {
        y <- do.call(data.frame, x)
        if("data.frame" %in% sapply(y, class))
          unnest_dataframes(y)
        y
      }
      
      unnest_dataframes(df) %>% select(name, engine = type.engine)
      

      输出

      #   name engine
      # 1    a      1
      # 2    b      2
      # 3    c      3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 2020-06-16
        相关资源
        最近更新 更多