使用匹配函数查找和替换R中数据框中的缺失值(已关闭)

时间:2012-11-29 14:32:16

标签: r

我有以下数据框

t <- strptime(c("2012-01-01 00:00:00","2012-01-01 01:00:00", "2012-01-01 02:00:00", "2012-01-01 05:00:00", "2012-01-01 06:00:00"), format ="%Y-%m-%d %H:%M:%S");t
d1 <- 2:6
d2 <- 15:11
dfr <- data.frame(t, d1, d2);dfr

                   t d1 d2
 2012-01-01 00:00:00  2 15
 2012-01-01 01:00:00  3 14
 2012-01-01 02:00:00  4 13
 2012-01-01 05:00:00  5 12
 2012-01-01 06:00:00  6 11

您可能会注意到缺少来自“2012-01-01 03:00:00”和“2012-01-01 04:00:00”的数据。

为了找出缺失的数据,我首先生成了一个正确的时间步,然后将其与“t”列进行比较,如下所示。

    t1Gen <- strptime("2012-01-01 00:00:00",format="%Y-%m-%d %H:%M:%S");
    t2Gen <- strptime("2012-01-01 06:00:00",format="%Y-%m-%d %H:%M:%S");

    tGen <- seq(t1Gen,t2Gen, 3600);tGen

"2012-01-01 00:00:00 CET" 
"2012-01-01 01:00:00 CET" 
"2012-01-01 02:00:00 CET" 
"2012-01-01 03:00:00 CET" 
"2012-01-01 04:00:00 CET" 
"2012-01-01 05:00:00 CET" 
"2012-01-01 06:00:00 CET"

mdfr <- match(tGen,dfr$t);mdfr
[1]  1  2  3 NA NA  4  5
subfr <- subset(mdfr, is.na(mdfr));subfr
[1] NA NA

使用匹配功能,“NA”将2个元素单独删除。现在我的目标是用“-99”填写两个缺失的行,以显示数据丢失,结果数据框看起来像这样;

                   t d1 d2
 2012-01-01 00:00:00  2 15
 2012-01-01 01:00:00  3 14
 2012-01-01 02:00:00  3 14
 2012-01-01 03:00:00 -99-99
 2012-01-01 04:00:00 -99-99
 2012-01-01 05:00:00  5 12
 2012-01-01 06:00:00  6 11

我坚持到这一点,任何对此的帮助都会受到赞赏。 P.S:欢迎任何其他代码。感谢

2 个答案:

答案 0 :(得分:2)

您可以merge dfrtGen向量(将后者转换为data.frame之后)。指定all = TRUE可以使用NA填充缺失的行。

dfrM <- merge(dfr, data.frame(t = tGen), all = TRUE)

然后确定缺少哪些值并替换为-99

dfrM[is.na(dfrM)] <- -99

> dfrM
                    t  d1  d2
1 2012-01-01 00:00:00   2  15
2 2012-01-01 01:00:00   3  14
3 2012-01-01 02:00:00   4  13
4 2012-01-01 03:00:00 -99 -99
5 2012-01-01 04:00:00 -99 -99
6 2012-01-01 05:00:00   5  12
7 2012-01-01 06:00:00   6  11

答案 1 :(得分:0)

你快到了!

dfr[subfr, -1] <-  -99   
# assumes that time is your first column, and the rest of the row gets -99

<小时/>

如果您愿意,也可以组合几行:

dfr[is.na(match(tGen,dfr$t)), -1] <-  -99