2014-11-20 5 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, вы можете оставить запятую, и в столбце останется список/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 
Смежные вопросы