我有一个包含多个列的数据框。我想在其中一列上运行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 ...
答案 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)