首页 > 解决方案 > 如何根据 R 中其他 ID 的单元格值/特征将 ID 的 NA 更改为字符值?

问题描述

我的数据集中存在缺失值的问题。出于某种原因,一些 ID 在“名称”列中缺少一个值。这很奇怪,因为其他 ID(具有相同的代码(我的整个数据集中有更多代码(>10K)和同一年(6 个选项))在该列中确实有一个值。

有人可以帮我找出代码,以便在“名称”列中缺少值的 ID,在“名称”列中获得相同的字符值,如果其他 ID 具有相同的代码和年份,则确实有一个值柱子?

例如:第 4 行的 NA;应改为“医院”;基于相同的代码和年份,另一个 ID。(在我的原始数据框中,有一个 ID 为 2013 和代码 01,名称为“医院”;如果没有,它应该保持 NA)。

旁注:它是面板数据,因此每个 ID 可以在数据集中存在多年(和行;每年是一行),而不是每个人都在每一年。我的数据框中还有更多变量。

> dput(Dataframe[1:7, ])
structure(list(ID = structure(c(1, 2, 2, 2, 2, 2, 2), format.spss = "F9.3"), CODE = c("01", "01", "01","01", "01", "01", "01"), Year = structure(c(2018, 2014, 2018, 2013, 2013, 2015, 2015), format.spss = "F9.3"), Quarter = structure(c(3, 4, 4, 4, 3, 4, 3), format.spss = "F9.3"), Size = c(24.5, 23.25, 24.5, 30, 30, 19.25, 19.25), Names = c("Hospital", "Hospital", "Hospital", NA, "Hospital", NA, "Hospital")), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"

A tibble: 7 x 8
  ID Gender CODE Year Quarter Size Names
       <dbl>      <dbl> <dttm>              <chr>            <dbl>           <dbl>           <dbl> <chr>                  
1  1          2 01          2018               3            24.5 Hospital
2  2          1 01          2014               4            23.2 Hospital
3  2          1 01          2018               4            24.5 Hospital
4  2          1 01          2013               4            30   NA                     
5  2          1 01          2013               3            30   Hospital
6  2          1 01          2015               4            19.2 NA                     
7  2          1 01          2015               3            19.2 Hospital

选择和检查单个行的工作量太大,我有超过 110 万行..

编辑:如果“名称”列具有(字符)值,也可以将其传输为 1,如果是 NA,则将其传输为 0。

谢谢!

标签: rdplyrtidyversena

解决方案


我不确定,因为在您的示例中所有名称都相同,但我认为这可能会满足您的需求。

我将下面的示例更改为姓氏为“非医院”。

df <- structure(list(ID = structure(c(1, 2, 2, 2, 2, 2, 2), format.spss = "F9.3"), CODE = c("01", "01", "01","01", "01", "01", "01"), Year = structure(c(2018, 2014, 2018, 2013, 2013, 2015, 2015), format.spss = "F9.3"), Quarter = structure(c(3, 4, 4, 4, 3, 4, 3), format.spss = "F9.3"), Size = c(24.5, 23.25, 24.5, 30, 30, 19.25, 19.25), Names = c("Hospital", "Hospital", "Hospital", NA, "Hospital", NA, "Not Hospital")), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame") ) 

原来的

# A tibble: 7 x 6
     ID CODE   Year Quarter  Size Names       
  <dbl> <chr> <dbl>   <dbl> <dbl> <chr>       
1     1 01     2018       3  24.5 Hospital    
2     2 01     2014       4  23.2 Hospital    
3     2 01     2018       4  24.5 Hospital    
4     2 01     2013       4  30   NA          
5     2 01     2013       3  30   Hospital    
6     2 01     2015       4  19.2 NA          
7     2 01     2015       3  19.2 Not Hospital

这是更新名称的代码。

df %>%
  filter(!is.na(Names)) %>%
  select(CODE, Year, Names)  %>%
  group_by_all() %>%
  summarise() %>%
  right_join(df, by = c("CODE", "Year")) %>%
  rename(Names = Names.x) %>%
  select(-Names.y)

输出:

# A tibble: 7 x 6
# Groups:   CODE, Year [4]
  CODE   Year Names           ID Quarter  Size
  <chr> <dbl> <chr>        <dbl>   <dbl> <dbl>
1 01     2018 Hospital         1       3  24.5
2 01     2014 Hospital         2       4  23.2
3 01     2018 Hospital         2       4  24.5
4 01     2013 Hospital         2       4  30  
5 01     2013 Hospital         2       3  30  
6 01     2015 Not Hospital     2       4  19.2
7 01     2015 Not Hospital     2       3  19.2

推荐阅读