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