我有一个名为'foo'的数据框:
foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-"))
'foo'作为CSV文件从其他程序上传,有两列。一个是数字数据类型,另一个是因子数据类型。
str(foo)
'data.frame': 5 obs. of 2 variables:
$ row1: num 1 2 3 4 5
$ row2: Factor w/ 4 levels "-","1","2.01",..: 2 3 4 1 1
注意有破折号,例如“ - ”,在foo $ row2中,这会导致此列成为一个因素。我想用零替换短划线,这样data.class(foo $ row2)将返回'numeric'。我们的想法是替换每列中的所有破折号,以便我可以使用R对其进行数字分析。
在R中执行此操作的最简单方法是什么?
谢谢,
答案 0 :(得分:2)
这是一种简单的方法。可能有一种更优雅的方式,但这可行:
> foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-"))
> levels(foo$row2)[levels(foo$row2)=="-"]<-0
> foo$row2<-as.numeric(as.character(foo$row2))
> class(foo$row2)
[1] "numeric"
> foo
row1 row2
1 1 1.00
2 2 2.01
3 3 3.00
4 4 0.00
5 5 0.00
答案 1 :(得分:2)
问:我的想法是替换每列中的所有破折号,以便我可以用R对其进行数值分析。
将apply
或sapply
与sub
kk<-data.frame(apply(foo,2,function(x) as.numeric(sub("-",0,x))))
> kk
row1 row2
1 1 1.00
2 2 2.01
3 3 3.00
4 4 0.00
5 5 0.00
> str(kk$row2)
num [1:5] 1 2.01 3 0 0
或者,您可以使用sapply
kk<-data.frame(sapply(names(foo),function(x)as.numeric(sub("-",0,foo[,x]))))
更新:
如果您只想要第二个col,则无需使用apply
:foo$row2<- as.numeric(sub("-",0,foo[,2]))
答案 2 :(得分:1)
我会使用ifelse()
:
foo$row2 <- ifelse(foo$row2 == "-", 0, as.numeric(foo$row2))
您可能还需要as.character()
将因子转换为字符
答案 3 :(得分:1)
gsub
...
as.numeric( gsub("-" , 0 , foo[,2] ) )
#[1] 1.00 2.01 3.00 0.00 0.00