在数据帧的列上运行factor()时出错

时间:2015-12-22 07:12:19

标签: r dplyr

我有一个包含多个列的数据框。我想在其中一列上运行factor()函数,比如名称my_col。 最初我是这样做的

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

它出现以下错误

  

错误:&#39; x&#39;对于&#39; sort.list&#39;必须是原子的你有没有打过电话&#39;排序&#39;在...上   列出?

在提到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 ...

1 个答案:

答案 0 :(得分: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)