dplyr :: select - 包括新数据框末尾(或开头或中间)的所有其他列

时间:2015-08-16 22:57:33

标签: r dplyr

在与数据交互时,我发现dplyr库的select()函数是组织数据框列的好方法。

一个很好的用途,如果我碰巧使用有很多列的df,我经常发现自己将两个变量放在一起以便于比较。这样做时,我需要在之前或之后附加所有其他列。我发现matches(".")函数是一种非常方便的方法。

例如:

library(nycflights13)
library(dplyr)

# just have the five columns:
select(flights, carrier, tailnum, year, month, day) 

# new order for all column:
select(flights, carrier, tailnum, year, month, day, matches(".")) 
# matches(".")  attached all other columns to end of new data frame

问题 - 如果有更好的方法,我很好奇吗?更灵活的意义上更好。

例如一个问题:是否有某种方法可以包含"所有其他问题"新data.frame的开头或中间的列? (请注意,select(flights, matches("."), year, month, day, )没有产生所需的结果,因为matches(".")附加了所有列,year, month, day被忽略,因为它们是现有列名的重复。)

2 个答案:

答案 0 :(得分:32)

  

如果您想重新排序列

  • 所有其他列最后
  • select(flights, carrier, tailnum, year, month, day, everything()) 
    

    或者分两步,选择字符向量中提供的变量one_of("x", "y", "z")

    col <- c("carrier", "tailnum", "year", "month", "day")
    select(flights, one_of(col), everything()) 
    

  • 所有其他列开头
  • select(flights, -one_of(col), one_of(col))
    
      

    如果您想使用dplyr 再次添加所有数据框

  • 最后的所有数据框:
  • bind_cols(select(flights, one_of(col)), flights)
    

  • 开头的所有数据框:
  • bind_cols(flights, select(flights, one_of(col)))
    

    答案 1 :(得分:1)

    虽然不是一个非常优雅的解决方案,但它确实有效。

      select(flights, carrier, tailnum, 
    one_of(setdiff(colnames(flights),c("carrier","tailnum","year"))),year)
    

    我使用setdiff函数进行比较。由于select不接受字符串参数,我使用了one_of函数。有关select参数的许多实用程序函数的列表,您可以参考此post