我的数据帧是这样的
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的方法有一些错误,要么是数据是如何形成的有错误。虽然这个补丁可以解决这些类型的错误,但最好是修复导致这种错误的错误。