2015-12-22 39 views
3

我有一个数据帧,它有几列。我想在其中一列上运行factor()函数,比如名称my_col。 起初,我就是这么做的数据帧的列上运行因子()的错误

df[,"my_col"]<-factor((df[,"my_col"])) 

它给了以下错误

Error: 'x' must be atomic for 'sort.list' Have you called 'sort' on a list?

上指的是similar question上,所以我的问题得到解决。

现在,如果不是第一种方法我尝试下面的代码,它完美而无须给予任何错误

df$"my_col"<-factor(df$"my_col") 

为什么?通过df $ vec_name和df [,vec_name]访问列是否有区别?

更新:

str(df) 
Classes 'tbl_df', 'tbl' and 'data.frame': 160 obs. of 8 variables: 
$ area  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ temp  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ size  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ storage : int 1 1 1 1 1 2 2 2 2 2 ... 
$ my_col : int 1 2 3 4 5 1 2 3 4 5 ... 
$ texture : num 2.9 2.3 2.5 2.1 1.9 1.8 2.6 3 2.2 2 ... 
$ flavor : num 3.2 2.5 2.8 2.9 2.8 3 3.1 3 3.2 2.8 ... 
$ moistness: num 3 2.6 2.8 2.4 2.2 1.7 2.4 2.9 2.5 1.9 ... 

回答

4

你的数据是tbl_df。我没有你的数据,但我们可以使用mtcars来看一个例子。

library(dplyr) 

tbl_df(mtcars)[, "mpg"] 
# Source: local data frame [32 x 1] 
# 
#  mpg 
# (dbl) 
# 1 21.0 
# 2 21.0 
# 3 22.8 
# 4 21.4 
# 5 18.7 
# 6 18.1 
# 7 14.3 
# 8 24.4 
# 9 22.8 
# 10 19.2 
# .. ... 

它仍然是一个数据框架,而在基础R它将被放置到原子向量。 dplyr:::`[.tbl_df`不会丢弃单列,如从基址R的[.data.frame中所做的那样。这就是为什么我们无法在其上运行factor()的原因。

factor(tbl_df(mtcars)[, "mpg"]) 
# Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
# Have you called 'sort' on a list? 

所以你需要使用[[,为df[["my_col"]],或者只是使用$

df[["my_col"]] <- factor(df[["my_col"]]) 

注:当您使用$操作符,你可以不用绕柱名引号。

df$my_col <- factor(df$my_col)