我有一个数据框,我从csv文件填充如下(仅供样本的数据):
> csv_data <- read.csv('test.csv')
> csv_data
gender country income
1 1 20 10000
2 2 20 12000
3 2 23 3000
我想将国家/地区转换为系数。但是当我执行以下操作时,它会失败:
> csv_data[,2] <- lapply(csv_data[,2], factor)
Warning message:
In `[<-.data.frame`(`*tmp*`, , 2, value = list(1L, 1L, 1L)) :
provided 3 variables to replace 1 variables
但是,如果我将性别和国家/地区转换为因子,则会成功:
> csv_data[,1:2] <- lapply(csv_data[,1:2], factor)
> is.factor(csv_data[,1])
[1] TRUE
> is.factor(csv_data[,2])
[1] TRUE
我做错了吗?我想使用lapply,因为我想以编程方式将列转换为因子,并且有可能要转换的列数只有1(它可能更多,这个数字是从参数驱动到函数)。我只能用lapply做任何方式吗?
答案 0 :(得分:0)
对一个列进行子集化时,您需要稍微更改一下。
之间存在很大差异
lapply(df[,2], factor)
和
lapply(df[2], factor)
## and/or
lapply(df[, 2, drop=FALSE], factor)
看看每个的输出。如果你删除逗号,一切都应该正常。使用[,]
中的逗号将单个列转换为向量,因此向量中的每个元素都是单独分解的。将其保留为列,这就是您希望在这种情况下为lapply
提供的列。但是,如果您使用drop=FALSE
,则可以保留逗号,该列将保留为list / data.frame。
不好:
df[,2] <- lapply(df[,2], factor)
# Warning message:
# In `[<-.data.frame`(`*tmp*`, , 2, value = list(1L, 1L, 1L)) :
# provided 3 variables to replace 1 variables
在一列上成功:
df[,2] <- lapply(df[,2,drop=FALSE], factor)
df[,2]
# [1] 20 20 23
# Levels: 20 23
在我看来,分组数据框列的最佳方法是没有逗号。这也成功了:
df[2] <- lapply(df[2], factor)
df[[2]]
# [1] 20 20 23
# Levels: 20 23