【问题标题】:Stop R from converting a character factor to number阻止 R 将字符因子转换为数字
【发布时间】:2020-10-05 13:38:06
【问题描述】:

我正在尝试将缺失的因子值转换为数据框中的 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       

【问题讨论】:

  • 抱歉打错了。我更正了。

标签: r dataframe


【解决方案1】:

感谢 Ronak Shah 的提示,我做到了,它给了我想要的东西。

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 和我之前的区别感到好奇,你可以找到答案here

您的建议

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

没有工作可能是因为缺少条目不是 NA?

【讨论】:

    【解决方案2】:

    将空值转换为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
    

    【讨论】:

    • 感谢并抱歉不清楚,但我希望“订单”在用 NA 替换缺失后仍然是一个因素。你知道为什么这些因子被转换为 2、3 和 4 吗?他们来自哪里?
    • @owl factors 在内部表示为数字,因此您会看到这些数字。如果您想保留orders 作为因素,您只能使用df &lt;- type.convert(df)
    • 谢谢!那会给我我想要的。直到现在我才意识到因素在内部表示为数字。
    • 一列只能有一个class。空值 ('') 是字符而不是数字。因此,如果您在 values 中输入一个空值,它会将完整的列转换为字符。
    • 如果您只想用NA 替换一列的空值,您可以使用df$values[is.na(df$values)] &lt;- NA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2015-06-01
    • 2018-07-18
    相关资源
    最近更新 更多