我从CSV文件导入了一个包含奇怪格式数字数据的大数据帧。这是我正在使用的数据框的可重现的例子:
df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))
'r2'包含具有负号的值,例如“ - ”和带零的值表示为破折号' - '。要对这个凌乱的r2列进行一些数值分析,我需要:
foo$row2<- as.numeric(sub("-",0,foo$row2))
R将用逗号格式化的值强制转换为NA,从而破坏列中的数据。 以下是运行foo$row2<- as.numeric(sub("-",0,foo$row2))
后的输出示例:
Warning message:
NAs introduced by coercion
r1 r2
1 1 1.00
2 2 2.01
3 3 3.00
4 4 0.00
5 5 NA
如你所见,“2,000”被强迫给NA。 -3错误地转换为3(删除了短划线)。但是,嘿,至少我们摆脱了第3排的“ - ”,对吧!!!
这最终是我想要制作的:
r1 r2
1 1 1.00
2 2 2.01
3 3 -3.00
4 4 0.00
5 5 2000
请注意,第5行中的逗号已删除。列r2应该格式化,以便我可以在其上运行sum(df$r2)
之类的命令。
答案 0 :(得分:5)
你的方法很健全。只需运行两次替换,一次删除任何只是破折号的东西,再一次删除任何逗号。
df$r2<-as.numeric(gsub('^-$','0',gsub(',','',df$r2)))
而且,如果您不熟悉正则表达式,^-$
我的意思是只删除以(^
)开头,短划线然后结束($
)的字符串
答案 1 :(得分:1)
nograpes的解决方案更酷:
## df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))
df$r2 <- as.numeric(gsub(",", "", df$r2))
df$r2[is.na(df$r2)] <- 0
## r1 r2
## 1 1 1.00
## 2 2 2.01
## 3 3 -3.00
## 4 4 0.00
## 5 5 2000.00