根据R中其他ID的单元格值/特征,如何将ID的NA更改为字符值?

问题描述 投票:0回答:1

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

[有人可以帮我弄清楚代码,以便在“名称”列中缺少值的ID的确在“名称”列中获得相同的字符值,如果其他具有相同代码和年份的ID确实具有值在该列中?

例如:第4行的NA;应更改为“医院”;基于相同的代码和年份,还有另一个ID。(在我的原始数据框中,有一个ID为2013,代码为01的名称为“ Hospital”;如果不是,则应保留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,如果不存在,则将其转换为0。

谢谢!

r dplyr tidyverse na
1个回答
0
投票

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

我将下面的示例更改为姓氏为“ Not Hospital”。

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
© www.soinside.com 2019 - 2024. All rights reserved.