lapply在数据框中的单列

时间:2014-11-20 19:23:01

标签: r

我有一个数据框,我从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做任何方式吗?

1 个答案:

答案 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