Изменение значения строки на основе другой строки из другого столбца - PullRequest
2 голосов
/ 04 июня 2019

У меня есть фрейм данных со столбцами A и B. Мне нужна помощь в написании функции, которая принимает все нулевые значения в A и заменяет их на основе значения в B. Если значение в столбце B - «Очень хорошо» или«Хороший», тогда он должен поставить «Home» в A. Если значение в столбце B - «Fair» или «Bad», то в «A.» должно быть указано «Иностранное». И, наконец, если значение в столбце B равно «Очень плохо »или« Худший », тогда следует поставить« Центральный »в A.

#Here's the data:
df <- structure(list(`A` = c("Home", NA, "Foreign", NA, "Central", NA), 
                 `B` = c("Good", "Very Good", "Bad", "Fair", "Very Bad", "Worst")),
            row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))


#Here's how the data look

     A       B
1   Home    Good
2   NA  Very Good
3   Foreign Bad
4   NA  Fair
5   Central Very Bad
6   NA  Worst

#Here's the expected result
     A       B
1   Home    Good
2   Home    Very Good
3   Foreign Bad
4   Foreign Fair
5   Central Very Bad
6   Central Worst

Ответы [ 2 ]

2 голосов
/ 04 июня 2019
library(dplyr)

df %>% mutate(tmp = case_when(B %in% c("Good", "Very Good") ~ "Home",
                              B %in% c("Bad", "Fair") ~ "Foreign",
                              B %in% c("Very Bad", "Worst") ~ "Central")) %>% 
       mutate(A = if_else(is.na(A),tmp,A)) %>% 
       select(-tmp)

#> # A tibble: 6 x 2
#>   A       B        
#>   <chr>   <chr>    
#> 1 Home    Good     
#> 2 Home    Very Good
#> 3 Foreign Bad      
#> 4 Foreign Fair     
#> 5 Central Very Bad 
#> 6 Central Worst
1 голос
/ 04 июня 2019
library(tidyverse)
df <- structure(list(`A` = c("Home", NA, "Foreign", NA, "Central", NA), 
                     `B` = c("Good", "Very Good", "Bad", "Fair", "Very Bad", "Worst")),
                row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))


df %>% 
  mutate(AA = ifelse(B %in% c("Good", "Very Good"), "Home", ifelse(B %in% c("Bad", "Fair"), "Foreign", ifelse(B %in% c("Very Bad", "Worst"), "Central", NA))),
  A = ifelse(is.na(A), AA, A))         
#> # A tibble: 6 x 3
#>   A       B         AA     
#>   <chr>   <chr>     <chr>  
#> 1 Home    Good      Home   
#> 2 Home    Very Good Home   
#> 3 Foreign Bad       Foreign
#> 4 Foreign Fair      Foreign
#> 5 Central Very Bad  Central
#> 6 Central Worst     Central
...