2016-03-22 9 views
1

Рассмотрим примерНеожиданное поведение с Grep и dplyr ТПС по сравнению с data.frame

library(dplyr) 

simple_dat_df <- data.frame(num = 1:5, let = letters[1:5], stringsAsFactors = FALSE) 

grepl("[a-z]", simple_dat_df$let) 
grepl("[a-z]", simple_dat_df[,"let"]) 

simple_dat_tbl <- data_frame(num = 1:5, let = letters[1:5]) 

grepl("[a-z]", simple_dat_tbl$let) 
grepl("[a-z]", simple_dat_tbl[,"let"]) 

Первые три grepl команды возвращают [1] TRUE TRUE TRUE TRUE TRUE. Последний только [1] TRUE.

Я ожидаю, что он будет таким же. В чем намерение? И как последнее заявление может также вернуть вектор?

+1

'simple_dat_tbl $ let' эквивалентно' igname (unlist (simple_dat_tbl [, "let"])) ' – RHertel

ответ

1

Это особенность dplyr. Если вы подмножите data_frame для получения одного столбца, это не упрощает вывод к вектору, что является стандартным поведением с data.frame. См:

class(simple_dat_tbl$let) 
[1] "character" 
class(simple_dat_tbl[,"let"]) 
[1] "tbl_df"  "data.frame" 

Вы можете использовать [[]], если вы хотите, чтобы вернуть вектор. См:

class(simple_dat_tbl[["let"]]) 
[1] "character" 

См this vignette для получения дополнительной информации.