2014-11-20 54 views
0

单个列我有我从csv文件填充如下(数据样本仅)的数据帧:lapply在数据帧

> 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

当为单个列进行子集化时,您需要稍微更改它。

lapply(df[,2], factor) 

lapply(df[2], factor) 
## and/or 
lapply(df[, 2, drop=FALSE], factor) 

之间有很大的区别看看每个输出。如果你删除逗号,一切都应该正常工作。在[,]中使用逗号可将单个列转换为矢量,因此矢量中的每个元素都可以单独分解。而将其留出则保留该列作为列表,这就是你想在这种情况下给予lapply的内容。但是,如果您使用drop=FALSE,则可以保留逗号,并且该列将保持为列表/数据帧。

不良:

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