【问题标题】:Replace special strings from all columns of data.frame in R using dplyR使用 dplyR 替换 R 中 data.frame 的所有列中的特殊字符串
【发布时间】:2021-01-31 18:24:13
【问题描述】:

我的数据框是这样的

value <- c(0,0.1,0.2,0.4,0,"0.05,",0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(1,1,"1,",1,2,2,2,2,3,3,3,3)
ID <- c("1,","2,","3,",4,1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)
test

   value time ID
1      0    1 1,
2    0.1    1 2,
3    0.2   1, 3,
4    0.4    1  4
5      0    2  1
6  0.05,    2  2
7   0.05    2  3
8    0.5    2  4
9    0.2    3  1
10   0.4    3  2
11   0.5    3  3
12   0.6    3  4

我想将所有列中的“,”替换为“”,但仍然出现错误 UseMethod("tbl_vars") 中的错误: 没有适用于“字符”类对象的“tbl_vars”方法 我希望我的数据看起来像这样

  value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    2  1
6   0.05    2  2
7   0.05    2  3
8   0.50    2  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

编辑

test %>% 
mutate_all(~gsub(",","",.))

【问题讨论】:

    标签: r dplyr tidyverse tidyr


    【解决方案1】:

    在这种情况下,最简单的方法可能是使用 readr 包中的 parse_number, 例如:

    apply(test, 2, readr::parse_number)
    

    dplyr 行话:

    test %>% mutate_all(readr::parse_number)
    

    【讨论】:

      【解决方案2】:

      一个简单的base R解决方案:

      test <- sapply(test, function(x) as.numeric(sub(",", "", x)))
      test
            value time ID
       [1,]  0.00    1  1
       [2,]  0.10    1  2
       [3,]  0.20    1  3
       [4,]  0.40    1  4
       [5,]  0.00    2  1
       [6,]  0.05    2  2
       [7,]  0.05    2  3
       [8,]  0.50    2  4
       [9,]  0.20    3  1
      [10,]  0.40    3  2
      [11,]  0.50    3  3
      [12,]  0.60    3  4
      

      【讨论】:

        【解决方案3】:
        test %>%
          mutate_at(vars(value, time, ID), ~ gsub(".*?(-?[0-9]+\\.?[0-9]*).*", "\\1", .))
        #    value time ID
        # 1      0    1  1
        # 2    0.1    1  2
        # 3    0.2    1  3
        # 4    0.4    1  4
        # 5      0    2  1
        # 6   0.05    2  2
        # 7   0.05    2  3
        # 8    0.5    2  4
        # 9    0.2    3  1
        # 10   0.4    3  2
        # 11   0.5    3  3
        # 12   0.6    3  4
        

        我们越是进入“让我们尝试解析可能是一个数字”的内容,它就会变得疯狂,包括科学记数法。为此,如果您可以接受更多包依赖项,readr::parse_number 已经建议可能是更好的候选者。

        但是...看到这表明导入方法有一些错误,或者数据形成有错误。虽然此补丁适用于此类错误,但最好修复导致此错误的任何错误。

        【讨论】:

        • 值仍然有逗号
        • 感谢您抽出宝贵的时间和详细的帖子 r2evans,非常感谢
        • 顺便说一句,我回答的一个前提是将数据保留为字符串,即使它看起来像一个数字。您的预期输出确实建议转换为 numericinteger,但您没有说明。无论哪种方式都没有问题,因为所有提供的方法都有优点/缺点。
        猜你喜欢
        • 1970-01-01
        • 2019-08-31
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        相关资源
        最近更新 更多