Остановить R от преобразования символьного множителя в число - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь преобразовать значения отсутствующих факторов в NA во фрейме данных и создать новый фрейм данных с замененными значениями, но когда я пытаюсь это сделать, все ранее символьные факторы преобразуются в числа. Я не могу понять, что делаю не так, и не могу найти похожий вопрос. Может ли кто-нибудь помочь?

Вот мои коды:

orders <- c('One','Two','Three', '')
ids <- c(1, 2, 3, 4)
values <- c(1.5, 100.6, 19.3, '')

df <- data.frame(orders, ids, values)
new.df <- as.data.frame(matrix( , ncol = ncol(df), nrow = 0))
names(new.df) <- names(df)

for(i in 1:nrow(df)){
    row.df <- df[i, ]
    print(row.df$orders) # "One", "Two", "Three", ""
    print(str(row.df$orders)) # Factor
    # Want to replace "orders" value in each row with NA if it is missing 
    row.df$orders <- ifelse(row.df$orders == "", NA, row.df$orders)
    print(row.df$orders) # Converted to number
    print(str(row.df$orders)) # int or logi
    # Add the row with new value to the new data frame
    new.df[nrow(new.df) + 1, ] <- row.df
    }

, и я получаю это:

> new.df
  orders ids values
1      2   1      2
2      4   2      3
3      3   3      4
4     NA   4      1

, но я хочу это:

> new.df
  orders ids values
1    One   1    1.5
2    Two   2  100.6
3  Three   3   19.3
4     NA   4       

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Преобразуйте пустые значения в NA и используйте type.convert, чтобы изменить их класс.

df[df == ''] <- NA
df <- type.convert(df)
df
#  orders ids values
#1    One   1    1.5
#2    Two   2  100.6
#3  Three   3   19.3
#4   <NA>   4     NA

str(df)
#'data.frame':  4 obs. of  3 variables:
#$ orders: Factor w/ 4 levels "","One","Three",..: 2 4 3 1
#$ ids   : int  1 2 3 4
#$ values: num  1.5 100.6 19.3 NA
0 голосов
/ 16 июня 2020

Благодаря подсказке Ронака Шаха, я сделал это, и это дало мне то, что я хотел.

df$orders[df$orders == ''] <- NA

Это даст мне:

> df
  orders ids values
1    One   1    1.5
2    Two   2  100.6
3  Three   3   19.3
4   <NA>   4       

> str(df)
'data.frame':   4 obs. of  3 variables:
 $ orders: Factor w/ 4 levels "","One","Three",..: 2 4 3 NA
 $ ids   : num  1 2 3 4
 $ values: Factor w/ 4 levels "","1.5","100.6",..: 2 3 4 1

На случай, если вам интересно о разнице между NA и тем, что было у меня, вы можете найти ответ здесь .

Ваше предложение

df$orders[is.na(df$orders)] <- NA

не сработало, возможно, потому что отсутствующая запись не является NA ?

...