2014-11-20 53 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