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



我的数据帧是这样的

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'的方法应用于' character '类的对象我希望我的数据看起来像这样

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)

一个简单的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
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可能是更好的候选。

然而…看到这一点表明,要么是import的方法有一些错误,要么是数据是如何形成的有错误。虽然这个补丁可以解决这些类型的错误,但最好是修复导致这种错误的错误。

最新更新