【问题标题】:R: Applying gsub to data frames returns NAsR:将 gsub 应用于数据帧会返回 NA
【发布时间】:2019-04-16 18:32:19
【问题描述】:

我正在尝试将包含数字和空格的数据框转换为数字。目前,数字采用factor 格式,有些带有“,”。

df <- data.frame(num1 = c("123,456,789", "1,234,567", "1,234", ""), num2 = c("","1,012","","202"))
df
         num1  num2
1 123,456,789      
2   1,234,567 1,012
3       1,234      
4               202

去掉“,”并转换为数字格式:

df2 = as.numeric(gsub(",","",df))
Warning message:
NAs introduced by coercion

有趣的是,如果我逐列执行相同的功能,它会起作用:

df$num1 = as.numeric(gsub(",","",df$num1)) 
df$num2 = as.numeric(gsub(",","",df$num2))
df
             num1  num2
    1   123456789    NA
    2     1234567  1012
    3        1234    NA
    4          NA   202

我的问题是 1. 原因是什么,是否有办法避免逐列转换它们,因为实际数据框有更多列;和 2. 为将来的数字运算删除 NA 或用 0 替换它们的最佳方法是什么?我知道我可以使用gsub 这样做,但我想知道是否有更好的方法。

【问题讨论】:

  • gsub/sub 工作于vectors你可以做df[] &lt;- lapply(df, gsub, pattern =",", replacement = "")
  • @akrun 我无法使用空格执行数字运算。用 0 替换空格的最佳方法是什么?非常感谢!

标签: r gsub


【解决方案1】:

,替换为''(str_replace_all)后,我们可以使用replace_na

library(dplyr)
library(stringr)
df %>% 
   mutate_all(list(~ str_replace_all(., ",", "") %>% 
                        as.numeric %>%
                        replace_na(0)))
#       num1 num2
#1 123456789    0
#2   1234567 1012
#3      1234    0
#4         0  202

gsub/sub 的问题在于它适用于 vector,如 ?gsub 中所述

x,文本 - 寻找匹配的字符向量,或者可以被 as.character 强制转换为字符向量的对象。支持长向量。

我们可以遍历列,应用gsub,并将输出分配回原始数据集

df[] <- lapply(df, function(x) as.numeric(gsub(",", "", x))) 
df[is.na(df)] <- 0 # change the NA elements to 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2021-10-25
    • 2017-07-09
    相关资源
    最近更新 更多