【发布时间】:2013-01-21 00:14:03
【问题描述】:
我有一个名为 LOAN 的表,其中包含名为 RATE 的列,其中观察值以百分比形式给出,例如 14.49% 我如何格式化该表以便编辑 rate 中的所有值并从条目中删除 % 以便我可以使用绘图功能。我尝试使用 strsplit。
strsplit(LOAN$RATE,"%")
但得到错误的非字符参数
【问题讨论】:
-
几乎可以肯定,因为 LOAN$RATE 是一个因素。
我有一个名为 LOAN 的表,其中包含名为 RATE 的列,其中观察值以百分比形式给出,例如 14.49% 我如何格式化该表以便编辑 rate 中的所有值并从条目中删除 % 以便我可以使用绘图功能。我尝试使用 strsplit。
strsplit(LOAN$RATE,"%")
但得到错误的非字符参数
【问题讨论】:
在打印时看起来是字符但 R 认为不是的项目通常是因子类对象。我还猜测您不会对 strsplit 将返回的列表输出感到满意。试试:
gsub( "%", "", as.character(LOAN$RATE) n)
显示为数字的因素也可能造成混淆:
> factor("14.9%")
[1] 14.9%
Levels: 14.9%
> as.character(factor("14.9%"))
[1] "14.9%"
> gsub("%", "", as.character(factor("14.9%")) )
[1] "14.9"
这尤其令人困惑,因为 print.data.frame 删除了引号:
> data.frame(z=factor("14.9%"), zz=factor(14.9))
z zz
1 14.9% 14.9
【讨论】:
gsub("%", "", paste(LOAN$RATE)) 给我们懒惰的打字员。我说懒了吗?我的意思是高效。
character。帮忙?
data$fundraising_goal <- as.numeric(gsub("\\$", "", data$fundraising_goal)),但这会产生“警告:强制引入的 NA”,我不确定在哪里/为什么...
这可以使用tidyverse 包中的mutate 动词来实现。在我看来,这更具可读性。
因此,为了举例说明这一点,我创建了一个名为 LOAN 的数据集,重点关注 RATE 来模拟上述问题。
library(tidyverse)
LOAN <- data.frame("SN" = 1:4, "Age" = c(21,47,68,33),
"Name" = c("John", "Dora", "Ali", "Marvin"),
"RATE" = c('16%', "24.5%", "27.81%", "22.11%"),
stringsAsFactors = FALSE)
head(LOAN)
SN Age Name RATE
1 1 21 John 16%
2 2 47 Dora 24.5%
3 3 68 Ali 27.81%
4 4 33 Marvin 22.11%
在接下来的内容中,mutate 允许更改列内容,gsub 执行所需的替换(% 与 ""),as.numeric() 将 RATE 列转换为 numeric 值,保持数据清洗流程的可遵循性。
LOAN <- LOAN %>% mutate(RATE = as.numeric(gsub("%", "", RATE)))
head(LOAN)
SN Age Name RATE
1 1 21 John 16.00
2 2 47 Dora 24.50
3 3 68 Ali 27.81
4 4 33 Marvin 22.11
【讨论】:
str_replace_all("%|=|:", "", RATE) 而不是gsub(),一切都会好起来的。请注意,要继续添加模式,您需要做的就是添加| 和旁边不需要的字符。对于一些特殊字符,例如"*, $",您需要通过添加“\”来转义每个字符。例如,“$”会变成"\$",然后添加上面的模式,看起来像str_replace_all("%|=|:|\$", "", RATE)。
试试:
LOAN$RATE <- sapply(LOAN$RATE, function(x), gsub("%", "", x))
【讨论】: