【问题标题】:R: Error converting character type to numeric type when using select_if() and gsub()R:使用 select_if() 和 gsub() 时将字符类型转换为数字类型时出错
【发布时间】:2021-07-04 13:14:39
【问题描述】:

我有多种类型的数据集。它是在 Excel 电子表格中创建的,因此某些数字包含逗号(例如 1,346 而不是 1346)。因此,将它们设为字符类型而不是数字类型。

这是我尝试进行的转换:

df[-2] %>% 
  select_if(is.character) %>% 
  as.numeric(gsub(",", "", df))

我从选择中排除第二列,因为它是我分析的有效字符类型。

我得到的错误是:

Error in df[-2] %>% select_if(is.character) %>% as.numeric(gsub(",",  : 
  'list' object cannot be coerced to type 'double'

我怎样才能做到这一点?

【问题讨论】:

    标签: r dplyr type-conversion pipeline


    【解决方案1】:

    如果我们需要这样做以将所有character 列上的, 替换为空白(""),请使用mutateacross 作为gsub/sub 等在vector 作为输入而不是data.frame

    library(stringr)
    library(dplyr)
    df1 <- df %>%
       mutate(across(where(is.character), ~ as.numeric(str_remove_all(., ','))))
    

    如果我们要排除第二列

    df1 <- df %>%
           mutate(across(c(where(is.character), -2), ~ 
                   as.numeric(str_remove_all(., ','))))
    

    请注意,select_ifselect(where 只会从原始数据中选择这些列。如果打算替换原始数据集列中的,,请将mutateacross 一起使用

    数据

    df <- structure(list(col1 = 1:5, col2 = c("a", "b", "c", "d", "e"), 
        col3 = c("1,2", "1,5", "1,3", "1,44", "1,46"), col4 = c("1,2", 
        "1,5", "1,3", "1,44", "1,46")), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

    • 这已经删除了逗号,但列仍然是字符类型。由于我需要选择列,因此我打算使用管道来避免必须单独转换每个功能。如何将您的上述代码转换为包含此内容?
    • @Joehat 用as.numeric 包装。抱歉忘记了。我更新了帖子
    • 太棒了!最后一件事......我需要从选择中排除第二列,因为它包含有效的字符类型。通过在上面的示例中执行 df[-2] ,它只会完全排除它。有没有办法可以再次修改代码以避免将这些列合并到新的 df1 数据集中?
    • @Joehat 为了防止出现错误,最好指定列号的列名,即-2可以是-col2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多