使用 dplyR 替换 R 中 data.frame 所有列的特殊字符串

Replace special strings from all columns of data.frame in R using dplyR

我的数据框是这样的

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' 的适用方法应用于 class“角色”的对象 我希望我的数据看起来像这样

  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(",","",.))

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

apply(test, 2, readr::parse_number)

dplyr行话:

test %>% mutate_all(readr::parse_number)
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 已经建议可能是更好的选择。

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

一个简单的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