1

我在 R 中组合了几个大型数据集,其中缺失值用“。”表示。我想做批量查找和替换“。” 在整个数据集中使用“NA”(大约有 35 列,数十万行)。我已经在各个列中尝试了 ifelse 语句,但是在此过程中,列的类从因子变为字符。当我转换回因子时,值已经改变。

示例数据框:

SHARP_ID YEAR  CAL_DATE JUL_DAY ST_TIME OBS_INIT NOISE
23971_p7 2012 28-Jul-12     210     837   RP_CAW        1
23971_p7 2012  2-Jun-12     154     735   RP_CAW        4
23971_p5 2012 28-Jul-12     210     855   RP_CAW        1
23971_p10 2012 28-Jun-12     180    1012   RP_CAW        3
23971_p10 2012 28-Jul-12     210     813   RP_CAW        1
23971_p2 2012 28-Jun-12     180     856   RP_CAW        .
23971_p2 2012 28-Jun-12     180     856   RP_CAW        2
23971_p2 2012 28-Jul-12     210     921   RP_CAW        1
23971_p5 2012  2-Jun-12     154     753   RP_CAW        .
23971_p5 2012  2-Jun-12     154     753   RP_CAW        .

我尝试过使用 ifelse、lapply 和 gsub,但是在所有情况下,列的模式(在本例中为 NOISE)都会从因子变为字符。当我尝试将其切换回因子时,值是不同的。例如:

> levels(d$NOISE)
[1] "." "0" "1" "2" "3" "4"
> class(d$NOISE)
[1] "factor"
> d$NOISE=ifelse(d$NOISE==".",as.factor("NA"),as.factor(d$NOISE))
> class(d$NOISE)
[1] "integer"
> d=RP12[,1:24]
> levels(d$NOISE)
[1] "." "0" "1" "2" "3" "4"
> class(d$NOISE)
[1] "factor"
> d$NOISE=ifelse(d$NOISE==".",as.factor("NA"),as.factor(d$NOISE))
> class(d$NOISE)
[1] "integer"
> d$NOISE=as.factor(d$NOISE)
> class(d$NOISE)
[1] "factor"
> levels(d$NOISE)
[1] "1" "2" "3" "4" "5" "6"

我需要对此数据集中的许多值进行全面查找/替换,并且大多数情况下它们将等同于 Excel 中特定于单元格的查找和替换。这些数据库太大了,无法在 Excel 中处理,所以我在这里。我是 R 中数据管理的新手,所以请多多包涵,非常感谢。

4

1 回答 1

2

你把事情复杂化了:

d[d == "."] <- NA

如果不清楚,这里发生的是 R 检查数据框中的每个值是否等于".". 然后它返回一个与原始数据相同尺寸的数据框,在TRUE满足条件和不满足条件的任何地方都有一个值False。然后,您使用此数据框来指示应替换访问的原始值的哪些值,在这种情况下将替换为NA.

无论班级如何,这都应该有效;factorcharacter向量都将返回并TRUE在适当的地方进行修改,而其他类将返回FALSE并被传递。

编辑:可重现的演示

> d <- data.frame(
+   a = c ("A", "B", "."),
+   b = as.character(c("A", "B", ".")),
+   c = c(1,2,3)
+ )
> d
  a b c
1 A A 1
2 B B 2
3 . . 3
> d[d == "."] <- NA
> d
     a    b c
1    A    A 1
2    B    B 2
3 <NA> <NA> 3
于 2015-02-03T20:54:18.287 回答