r - 使用 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)
解决方案
这是一种方法。对于那些有crossed_over
名称的行,将 设置为前半行new_last_name
的名称,以及crossed_over
后半行之间的差异。crossed_over
last_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
推荐阅读
- rider - 在 Rider 中将设置应用为机器范围
- excel - 如何在不同的工作表中复制形状?
- pandas - 如何根据熊猫中的if-else条件从元组索引中提取字符串?
- c++ - 如何在 C++ 中为 cin.ignore() 指定多个分隔符?
- javascript - Reactjs实时禁用按钮onclick
- azure - 如何将私有链接用于 Synapse 工作区 SQL On-Demand?
- python - 如何解决 ValueError:无法找到令牌种子!https://translate.google.com 有变化吗?
- python - Python猜谜游戏[骰子]
- internationalization - 如何使用 kotlin js 支持 i18n
- reactjs - 如何在 React Typescript 中更改接口属性的状态值?