使用 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
我的数据框是这样的
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