tbl_df Dplyr дает неожиданное поведение при выборе столбца по строке

Часто при программном использовании dplyr мне нужно выбрать столбец по его имени, где имя столбца хранится в виде строки в некоторой переменной.

Я заметил, что попытки сделать это с помощью dplyr часто приводят к неожиданным результатам. Похоже, это связано с тем, как обрабатывается tbl_df.

Ниже приведены некоторые примеры:

## regular data frame:
df = data.frame(subject = 1:3, resp = c(2,3,3))   # example dataframe
response_column = "resp"                     # I want to select the contents of a column with a string                       

# for loop over unique values:
unique_responses = unique(df[,response_column])
for (resp in unique_responses) {
  cat("\nA response:", resp)
}

# convert column type:
df[,response_column] = as.character(df[,response_column])
str(df) # modified the column

Вот такие вещи я привык делать. Доступ к содержимому столбцов, их преобразование и переназначение, получение их уникальных значений и т. д.

Но когда в data.frame есть классы tbl_df и tbl, все тоже не работает.

## with tbl_df and tbl 
require(dplyr)
df = data.frame(subject = 1:3, resp = c(2,3,3))
class(df) = c("tbl_df","tbl", class(df))
class(df)
df[,response_column] 

# for loop doesn't seem to know what to do with this:
unique_responses = unique(df[,response_column])
for (resp in unique_responses) {
  cat("\nA response:", resp)
}

# as.character seems to concatenate the entire column into one string!
df[,response_column] = as.character(df[,response_column])
df

Я не был уверен, что делать с этим поведением (т. е. преднамеренным или ошибкой) или вообще, как лучше всего использовать один и тот же (программный) код в обычных фреймах данных, а также в фреймах данных dplyr.


person jwdink    schedule 30.01.2015    source источник
comment
tbl_df в документации сказано: [ Никогда не упрощает (не отбрасывает), поэтому всегда возвращает data.frame. Объясняет ли это проблему?   -  person Khashaa    schedule 30.01.2015
comment
Используйте df[[response_column]] вместо df[ ,response_column ] для извлечения значений столбца.   -  person MrFlick    schedule 30.01.2015