0

我有一个名为“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) 将返回“数字”。这个想法是替换每列中的所有破折号,以便我可以使用 R 对其进行数字分析。

在 R 中执行此操作的最简单方法是什么?

谢谢,

4

4 回答 4

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
于 2013-10-17T21:19:15.867 回答
2

问:想法是替换每列中的所有破折号,以便我可以使用 R 对其进行数值分析。

使用applysapplysub

 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,你不需要使用applyfoo$row2<- as.numeric(sub("-",0,foo[,2]))

于 2013-10-17T21:23:20.327 回答
1

我会用ifelse()这个: foo$row2 <- ifelse(foo$row2 == "-", 0, as.numeric(foo$row2))

您可能还需要 asas.character()从因子转换为字符

于 2013-10-17T21:17:48.947 回答
1

怎么样gsub...

as.numeric( gsub("-" , 0 , foo[,2] ) )
#[1] 1.00 2.01 3.00 0.00 0.00
于 2013-10-17T21:34:07.800 回答