首页 > 解决方案 > 使用 r 根据另一列中的值编辑字符串值

问题描述

我有 1990-1999 年期间结婚并有时改姓的女性的数据。但是,我并不总是知道姓名更改发生的确切年份,只知道姓氏在 x 年和 y 年之间的某个时间发生了变化。在原始数据中,老姓只被划掉了,新姓在旁边写了,在“crossed_over”一栏中注明。例如,莎拉·史密斯在 1994 年至 1999 年期间的某个时候将她的名字改为莎拉·德雷珀。

我想要的是每个女人每年都有一个独特的姓氏,比如 Liza Moore 将她的名字改为 Liza Neville,最好在分配姓氏时使用“crossed_over”列取平均值。例如,Sarah Smith 将在 1997 年成为 Sarah Draper,而 Mary King 将在 1997 年或 1998 年成为 Mary Fisher。

有没有人建议我如何使用下面的示例来实现这一点?

library(tidyverse)

id <- rep(1:4, each = 10)
year <- rep(1990:1999, 4)
first_name <- c(rep("molly", 10), rep("sarah", 10), rep("mary", 10), rep("liza", 10))
last_name <- c(rep("johnson", 10), rep("smith", 4), rep("smith draper", 6), rep("king", 5), rep("king fisher", 5), 
               rep("moore", 7), rep("neville", 3))
crossed_over <- c(rep(NA, 10), rep(NA, 4), rep("smith", 6), rep(NA, 5), rep("king", 5), rep(NA, 10))

df <- tibble(id, year, first_name, last_name, crossed_over)

在此处输入图像描述

标签: rdplyrtidyverse

解决方案


这是一种方法。对于那些有crossed_over名称的行,将 设置为前半行new_last_name的名称,以及crossed_over后半行之间的差异。crossed_overlast_name

library(tidyverse)
library(stringr)

df %>%
  filter(!is.na(crossed_over)) %>%
  group_by(across(c(-year))) %>%
  mutate(new_last_name = ifelse(row_number() <= n()/2,
                                crossed_over,
                                str_trim(str_remove(last_name, crossed_over)))) %>%
  ungroup() %>%
  right_join(df) %>%
  mutate(new_last_name = coalesce(new_last_name, last_name)) %>%
  arrange(id, year) 

输出

      id  year first_name last_name    crossed_over new_last_name
   <int> <int> <chr>      <chr>        <chr>        <chr>        
 1     1  1990 molly      johnson      NA           johnson      
 2     1  1991 molly      johnson      NA           johnson      
 3     1  1992 molly      johnson      NA           johnson      
 4     1  1993 molly      johnson      NA           johnson      
 5     1  1994 molly      johnson      NA           johnson      
 6     1  1995 molly      johnson      NA           johnson      
 7     1  1996 molly      johnson      NA           johnson      
 8     1  1997 molly      johnson      NA           johnson      
 9     1  1998 molly      johnson      NA           johnson      
10     1  1999 molly      johnson      NA           johnson      
11     2  1990 sarah      smith        NA           smith        
12     2  1991 sarah      smith        NA           smith        
13     2  1992 sarah      smith        NA           smith        
14     2  1993 sarah      smith        NA           smith        
15     2  1994 sarah      smith draper smith        smith        
16     2  1995 sarah      smith draper smith        smith        
17     2  1996 sarah      smith draper smith        smith        
18     2  1997 sarah      smith draper smith        draper       
19     2  1998 sarah      smith draper smith        draper       
20     2  1999 sarah      smith draper smith        draper       
21     3  1990 mary       king         NA           king         
22     3  1991 mary       king         NA           king         
23     3  1992 mary       king         NA           king         
24     3  1993 mary       king         NA           king         
25     3  1994 mary       king         NA           king         
26     3  1995 mary       king fisher  king         king         
27     3  1996 mary       king fisher  king         king         
28     3  1997 mary       king fisher  king         fisher       
29     3  1998 mary       king fisher  king         fisher       
30     3  1999 mary       king fisher  king         fisher       
31     4  1990 liza       moore        NA           moore        
32     4  1991 liza       moore        NA           moore        
33     4  1992 liza       moore        NA           moore        
34     4  1993 liza       moore        NA           moore        
35     4  1994 liza       moore        NA           moore        
36     4  1995 liza       moore        NA           moore        
37     4  1996 liza       moore        NA           moore        
38     4  1997 liza       neville      NA           neville      
39     4  1998 liza       neville      NA           neville      
40     4  1999 liza       neville      NA           neville 

推荐阅读