【问题标题】:Filling NA values in categorical variable with values above while maintaining other row values in R用上述值填充分类变量中的 NA 值,同时保持 R 中的其他行值
【发布时间】:2019-06-26 13:47:24
【问题描述】:

编辑:

sujmshyftw 的回答适用于下面的示例代码,但值得指出的是,您需要先使用 arrange,然后才能有效地部署 fill

原始问题

包含相关问题的一些印度议会选区 (AC) 选举数据的 sn-p 如下所示:

AC_elections <- structure(list(ST_NAME = c("Gujarat", "Gujarat", "Gujarat", "Gujarat", 
"Gujarat", "Gujarat", "Gujarat", "Gujarat", "Gujarat", "Gujarat", 
"Madhya Pradesh", "Madhya Pradesh", "Madhya Pradesh", "Madhya Pradesh"
), AC_NO = c(44, 45, 46, 47, 48, 159, 160, 161, 162, 163, 204, 
205, 206, 207), DIST_NAME = structure(c(1L, NA, NA, NA, NA, 3L, 
NA, NA, NA, NA, 2L, NA, NA, NA), .Label = c("AHMADABAD", "INDORE", 
"SURAT"), class = "factor"), UR_TYPE = structure(c(1L, NA, NA, 
NA, NA, 1L, NA, NA, NA, NA, 1L, NA, NA, NA), .Label = "Urban", class = "factor"), 
    YEAR = c(2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 
    2012, 2012, 2013, 2013, 2013, 2013), AC_NAME = c("Ellisbridge", 
    "Naranpura", "Nikol", "Naroda", "Thakkarbapa Nagar", "Surat East", 
    "Surat North", "Varachha Road", "Karanj", "Limbayat", "Indore-1", 
    "Indore-2", "Indore-3", "Indore-4"), AC_TYPE = c("GEN", "GEN", 
    "GEN", "GEN", "GEN", "GEN", "GEN", "GEN", "GEN", "GEN", "GEN", 
    "GEN", "GEN", "GEN"), PARTYABBRE = c("BJP", "BJP", "BJP", 
    "BJP", "BJP", "BJP", "BJP", "BJP", "BJP", "BJP", "BJP", "BJP", 
    "BJP", "BJP")), row.names = c(974L, 4131L, 4132L, 4133L, 
4134L, 1077L, 4143L, 4144L, 4145L, 4146L, 2002L, 4151L, 4152L, 
4153L), class = "data.frame")

DIST_NAMEUR_TYPE 中应该替换 NA 值的值可以从这些 NA 值之前的 AC_NO 推导出来。因此,我们可以通过以下方式解决此问题:

AC_elections %>% 
  mutate(
    DIST_NAME = case_when(
       ST_NAME == "Gujarat" & AC_NO > 44 & AC_NO < 49 ~ "Ahmadabad"
       ST_NAME == "Gujarat" & AC_NO > 160 & AC_NO < 164 ~ "Surat"
       ST_NAME == "Madhya Pradesh" & AC_NO > 204 & AC_NO < 208 ~ "Indore"
      ),
  UR_TYPE = case_when (

    <similar code to above>

      )
  )

但我怀疑有一个更高效、更优雅的解决方案。我想知道zoo 中的na.fill 函数是否适用于这种情况。请注意,带有NA 的行的行号不遵循原始数据集中的相关AC_NO

感谢任何提示!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    也许是fill 函数?

    AC_election = AC_elections %>% fill(DIST_NAME, UR_TYPE)
    
    

    给你

                ST_NAME AC_NO DIST_NAME UR_TYPE YEAR           AC_NAME AC_TYPE PARTYABBRE
    974         Gujarat    44 AHMADABAD   Urban 2012       Ellisbridge     GEN        BJP
    4131        Gujarat    45 AHMADABAD   Urban 2012         Naranpura     GEN        BJP
    4132        Gujarat    46 AHMADABAD   Urban 2012             Nikol     GEN        BJP
    4133        Gujarat    47 AHMADABAD   Urban 2012            Naroda     GEN        BJP
    4134        Gujarat    48 AHMADABAD   Urban 2012 Thakkarbapa Nagar     GEN        BJP
    1077        Gujarat   159     SURAT   Urban 2012        Surat East     GEN        BJP
    4143        Gujarat   160     SURAT   Urban 2012       Surat North     GEN        BJP
    4144        Gujarat   161     SURAT   Urban 2012     Varachha Road     GEN        BJP
    4145        Gujarat   162     SURAT   Urban 2012            Karanj     GEN        BJP
    4146        Gujarat   163     SURAT   Urban 2012          Limbayat     GEN        BJP
    2002 Madhya Pradesh   204    INDORE   Urban 2013          Indore-1     GEN        BJP
    4151 Madhya Pradesh   205    INDORE   Urban 2013          Indore-2     GEN        BJP
    4152 Madhya Pradesh   206    INDORE   Urban 2013          Indore-3     GEN        BJP
    4153 Madhya Pradesh   207    INDORE   Urban 2013          Indore-4     GEN        BJP
    
    

    【讨论】:

    • 谢谢!我知道这将非常简单......!现在我可以看到有类似的问题,但它们没有出现在我的搜索中......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2015-11-09
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多