2014-12-19 2 views
0

Все данные поступают в формате символов. Когда я пытаюсь преобразовать подмножество данных в числовое значение с помощью apply, он, похоже, не работает.Как преобразовать столбцы подмножества всего фрейма строковых данных в числовые?

df2 <- as.data.frame(matrix(as.character(1:9),3,3)) 
df2[,-2] <- apply(df2[,-2], 2, as.numeric) 
apply(df2, 2, class) 

Может ли кто-нибудь указать мне, что я делаю неправильно в приведенном выше примере? Спасибо

+3

Матрица в R может содержать только значения одного и того же типа. Вы не можете изменить некоторые значения на числовые и оставить некоторые другие в качестве символов. Если вам нужны разные типы данных, вы можете использовать data.frame, но даже тогда вы можете иметь только один тип данных для каждого столбца. –

+0

Просто 'df2 <- data.frame (df2, strAsAsFactors = F)' после вашей первой строки. – nrussell

ответ

1

Как указано выше .. a matrix в R может хранить только значения одного и того же типа во всех столбцах. Вы не можете изменить некоторые значения на числовые и оставить некоторые другие в качестве символов. Если вам нужны разные типы данных, вы можете использовать data.frame, но даже тогда вы можете иметь только один тип данных для каждого столбца.

Для примера случай:

df2 <- as.data.frame(matrix(as.character(1:9),3,3)) 

создаст data.frame с factor сек в каждом столбце. Если вы хотите, чтобы преобразовать второй столбец numeric, вы можете сделать:

df2$V2 <- as.numeric(levels(df2$V2))[df2$V2] 

Или

df$V2 <- as.numeric(as.character(df2$V2)) 

Так что вам не нужно использовать apply в этом случае.

str(df2) 
#'data.frame': 3 obs. of 3 variables: 
# $ V1: Factor w/ 3 levels "1","2","3": 1 2 3 
# $ V2: num 4 5 6 
# $ V3: Factor w/ 3 levels "7","8","9": 1 2 3 

Если вы хотите, чтобы преобразовать все столбцы в цифровой, вы можете сделать:

# if the columns were factors before: 
df2[] <- lapply(df2, function(i) as.numeric(levels(i))[i]) 

Или

# if the columns were characters before: 
df2[] <- lapply(df2, as.numeric)