用条件替换NA

时间:2017-05-21 10:17:00

标签: r

我实际上正在运行计量经济学分析。我在这个分析中遇到了问题。我正在使用Rstudio。

我的数据库由1408(类型1为704,类型2为704)观察和49个变量组成。

Gender    Period   Matching group   Group  Type  Overcharging
1           1            73            1       1    NA
0           2            73            1       1    NA
1           1            77            2       1    NA
1           2            77            2       1    NA
...        ...          ...           ...     ...   ...
0           1            73            1       2    1
0           2            73            1       2    0
1           1            77            2       2    0
1           2            77            2       2    1
...        ...          ...           ...     ...   ...

您可以看到NA值与代理的类型相关(如果代理是类型1)。我想要做的是:如果类型1的代理属于相同的匹配组,代理的组和周期类型2,则将NA替换为类型2的代理的相同值(对于每一行)。 / p>

Expected output     
Gender    Period   Matching group   Group  Type  Overcharging
1           1            73            1       1    1
0           2            73            1       1    0
1           1            77            2       1    0
1           2            77            2       1    1
0           1            73            1       2    1
0           2            73            1       2    0
1           1            77            2       2    0
1           2            77            2       2    1

感谢您的时间和考虑!感谢帮助。

2 个答案:

答案 0 :(得分:0)

以下是data.table的解决方案:

library("data.table")
dt <- fread(header=TRUE,
'Gender    Period   Matching.group   Group  Type  Overcharging
1           1            73            1       1    NA
0           2            73            1       1    NA
1           1            77            2       1    NA
1           2            77            2       1    NA
0           1            73            1       2    1
0           2            73            1       2    0
1           1            77            2       2    0
1           2            77            2       2    1')

d2 <- dt[Type!=1, Overcharging, .(Group,Period)]
rbind(dt[Type==1][d2, on=.(Group, Period), Overcharging:=i.Overcharging],dt[Type!=1])

# > rbind(dt[Type==1][d2, on=.(Group, Period), Overcharging:=i.Overcharging],dt[Type!=1])
#    Gender Period Matching.group Group Type Overcharging
# 1:      1      1             73     1    1            1
# 2:      0      2             73     1    1            0
# 3:      1      1             77     2    1            0
# 4:      1      2             77     2    1            1
# 5:      0      1             73     1    2            1
# 6:      0      2             73     1    2            0
# 7:      1      1             77     2    2            0
# 8:      1      2             77     2    2            1

最终你可以在你的特殊情况下做:

dt[Type==1, Overcharging:=dt[Type!=1, Overcharging]]

(如果Type!=1的组和期间的顺序与Type==1的顺序相同)

答案 1 :(得分:0)

我们可以使用dplyrtidyr(来自tidyverse)的功能来执行此类任务。来自fill的{​​{1}}函数可以根据前一行或下一行来估算缺失值。因此,我们的想法是先排列数据框,然后使用tidyr来估算fill列中的所有NA

Overcharging