【问题标题】:Partially merge two datasets and fill in NAs in R部分合并两个数据集并在R中填写NA
【发布时间】:2016-04-30 23:35:27
【问题描述】:

我有两个数据集

a = 包含数千个不同天气事件观察结果的原始数据集

   STATE       EVTYPE
1     AL WINTER STORM
2     AL      TORNADO
3     AL    TSTM WIND
4     AL    TSTM WIND
5     AL    TSTM WIND
6     AL         HAIL
7     AL    HIGH WIND
8     AL    TSTM WIND
9     AL    TSTM WIND
10    AL    TSTM WIND

b = 一个字典表,它有一些天气事件的标准拼写。

                    EVTYPE       evmatch
1    HIGH SURF ADVISORY          <NA>
2         COASTAL FLOOD COASTAL FLOOD
3           FLASH FLOOD   FLASH FLOOD
4             LIGHTNING     LIGHTNING
5             TSTM WIND          <NA>
6       TSTM WIND (G45)          <NA>

两者都被evtype合并到df_new

library(dplyr)
df_new <- left_join(a, b, by = c("EVTYPE"))

   STATE       EVTYPE           evmatch
1     AL WINTER STORM      WINTER STORM
2     AL      TORNADO              NA
3     AL    TSTM WIND THUNDERSTORM WIND
4     AL    TSTM WIND THUNDERSTORM WIND
5     AL    TSTM WIND THUNDERSTORM WIND
6     AL         HAIL              NA
7     AL    HIGH WIND         HIGH WIND
8     AL    TSTM WIND THUNDERSTORM WIND
9     AL    TSTM WIND THUNDERSTORM WIND
10    AL    TSTM WIND THUNDERSTORM WIND
11    AL   HEAVY RAIN        NA
12    AL  FLASH FLOOD       NA
13    AL    TSTM WIND THUNDERSTORM WIND
14    AL   HEAVY RAIN        NA
15    AL    TSTM WIND THUNDERSTORM WIND

填写缺失的NAs

正如您在df_new$evmatch 中看到的,有一个 NA。如何合并数据集,但将evmatch 中的所有 NA 用来自EVTYPE 的相应单词填充。比如……

想要的输出

 STATE       EVTYPE           evmatch
1     AL WINTER STORM      WINTER STORM
2     AL      TORNADO           TORNADO
3     AL    TSTM WIND THUNDERSTORM WIND
4     AL    TSTM WIND THUNDERSTORM WIND
5     AL    TSTM WIND THUNDERSTORM WIND
6     AL         HAIL              HAIL
7     AL    HIGH WIND         HIGH WIND
8     AL    TSTM WIND THUNDERSTORM WIND
9     AL    TSTM WIND THUNDERSTORM WIND
10    AL    TSTM WIND THUNDERSTORM WIND
11    AL   HEAVY RAIN        HEAVY RAIN
12    AL  FLASH FLOOD       FLASH FLOOD
13    AL    TSTM WIND THUNDERSTORM WIND
14    AL   HEAVY RAIN        HEAVY RAIN
15    AL    TSTM WIND THUNDERSTORM WIND

【问题讨论】:

  • 看起来像一个简单的ifelse(is.na(evmatch), EVTYPE, evmatch),不是吗?或者我错过了什么。或使用here 中的基数。对于data.table,这可能是setDT(df_new)[is.na(evmatch), evmatch := EVTYPE]
  • df_new$evmatch[is.na(df_new$evmatch] &lt;- df_new$EVTYPE[is.na(df_new$evmatch]
  • dplyr 版本:filter(df_new, is.na(evmatch) %&gt;% select(evmatch) &lt;- filter(df_new, is.na(evmatch) %&gt;% select(EVTYPE) ...但老实说,我可能会使用上面的ifelse 版本。
  • 运行ifelse时,返回错误object 'evmatch' not found
  • ifelse中你需要使用df_new$evmatch

标签: r merge dplyr na missing-data


【解决方案1】:

问题的答案在 cmets 中给出:

1:使用基础 R

方法一:

df_new$evmatch <- with(df_new, ifelse(is.na(evmatch), EVTYPE, evmatch))

方法二:

df_new$evmatch[is.na(df_new$evmatch] <- df_new$EVTYPE[is.na(df_new$evmatch]

注意:确保两个 var 都是字符,否则会出现错误结果。如果需要,使用 as.character 进行转换。

2:使用data.table

library(data.table)
setDT(df_new)[is.na(evmatch), evmatch := EVTYPE]

3:使用dplyr

library(dplyr)
filter(df_new, is.na(evmatch) %>% 
         select(evmatch) <- filter(df_new, is.na(evmatch) %>% 
                                     select(EVTYPE)

【讨论】:

  • 你应该把它变成一个社区 wiki 答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多