在R中的多个列中查找和替换

时间:2015-02-03 20:46:23

标签: r if-statement database-management

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

示例data.frame:

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的数据管理新手,所以请耐心等待,非常感谢。

1 个答案:

答案 0 :(得分:2)

你的事情过于复杂:

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

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

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

修改:可重现的演示

FALSE