使用dplyr过滤掉包含字符的列

时间:2014-12-04 08:32:28

标签: r dplyr

我有一个大型数据框,我想使用我最近发现的优秀包dplyr(Wickham)。我想过滤掉包含字符的列。这可能吗?

例如,在flights包中的nycflights13数据集中,如何过滤掉具有类character的列?

library(nycflights13)
data(flights)
str(flights)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   336776 obs. of  16 variables:
 $ year     : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ month    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ day      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ dep_time : int  517 533 542 544 554 554 555 557 557 558 ...
 $ dep_delay: num  2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
 $ arr_time : int  830 850 923 1004 812 740 913 709 838 753 ...
 $ arr_delay: num  11 20 33 -18 -25 12 19 -14 -8 8 ...
 $ carrier  : chr  "UA" "UA" "AA" "B6" ...
 $ tailnum  : chr  "N14228" "N24211" "N619AA" "N804JB" ...
 $ flight   : int  1545 1714 1141 725 461 1696 507 5708 79 301 ...
 $ origin   : chr  "EWR" "LGA" "JFK" "JFK" ...
 $ dest     : chr  "IAH" "IAH" "MIA" "BQN" ...
 $ air_time : num  227 227 160 183 116 150 158 53 140 138 ...
 $ distance : num  1400 1416 1089 1576 762 ...
 $ hour     : num  5 5 5 5 5 5 5 5 5 5 ...
 $ minute   : num  17 33 42 44 54 54 55 57 57 58 ...

有什么想法吗?

5 个答案:

答案 0 :(得分:8)

您可以尝试summarise_each

中的dplyr
library(dplyr) 
indx <- which(unlist(summarise_each(flights, funs(class))!='character'))
flights %>% 
       select(indx)

答案 1 :(得分:5)

我不认为这有一个dplyr快捷方式,但你可以得到你所追求的:

flights %>% select(which(sapply(flights, class) != 'character'))

# Source: local data frame [336,776 x 12]
# 
#    year month day dep_time dep_delay arr_time arr_delay flight air_time distance hour minute
# 1  2013     1   1      517         2      830        11   1545      227     1400    5     17
# 2  2013     1   1      533         4      850        20   1714      227     1416    5     33
# 3  2013     1   1      542         2      923        33   1141      160     1089    5     42
# 4  2013     1   1      544        -1     1004       -18    725      183     1576    5     44
# 5  2013     1   1      554        -6      812       -25    461      116      762    5     54
# 6  2013     1   1      554        -4      740        12   1696      150      719    5     54
# 7  2013     1   1      555        -5      913        19    507      158     1065    5     55
# 8  2013     1   1      557        -3      709       -14   5708       53      229    5     57
# 9  2013     1   1      557        -3      838        -8     79      140      944    5     57
# 10 2013     1   1      558        -2      753         8    301      138      733    5     58
# ..  ...   ... ...      ...       ...      ...       ...    ...      ...      ...  ...    ...

答案 2 :(得分:5)

我没有飞行数据,但此方法也适用于我实验过的其他一些数据

do(flights, Filter(Negate(is.character), .))

当然,总是有基础R.对于这个任务来说似乎更容易

Filter(Negate(is.character), flights)

答案 3 :(得分:5)

你不需要dplyr,你可以使用基数R:

flights[, !sapply(flights, is.character)]

答案 4 :(得分:0)

以下是使用dplyr的{​​{1}} / tidyverse选项(使用dplyr starwars示例数据):

select_if()