R中的数据帧部分合并
我有一个如下所示的数据框:R中的数据帧部分合并,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个如下所示的数据框: name workplace year note1 note2 job Ben Alpha 2011 xxxx xx director Ben Beta 2011 xx xxx director Ben Beta 2011 xxx xxxx vice president Wendy Sigma 2011 xxxx x
name workplace year note1 note2 job
Ben Alpha 2011 xxxx xx director
Ben Beta 2011 xx xxx director
Ben Beta 2011 xxx xxxx vice president
Wendy Sigma 2011 xxxx x director
Wendy Sigma 2011 xx xx vice president
Wendy Sigma 2011 x xxx CEO
Alice Beta 2011 xxx x staff
Alice Beta 2012 xx xx deputy director
我想基于“名称”、“WorkWord”和“年份”来标识和合并重复行(不要考虑列“NOTE1”和“NOTE2”),列“作业”中的信息将被合并。输出应该如下所示。“工作”中的信息是基于“名称”、“WorkWord”和“年份”的匹配而合并的。“和”note2“不需要合并,应该是匹配行第一行中的“note1”和“note2”信息:
name workplace year note1 note2 job.1 job.2 job.3
Ben Alpha 2011 xxxx xx director NA NA
Ben Beta 2011 xx xxx director vice president
Wendy Sigma 2011 xxxx x director vice president CEO
Alice Beta 2011 xxx x staff NA
Alice Beta 2012 xx xx secretary NA NA
这里有一种使用
dplyr
和tidyr
的方法。首先,我删除notes字段以分别处理这些字段。然后,我为名称/工作场所/年份组中的每个工作行分配一个行号。然后根据这些作业展开列。最后,从每个姓名/工作场所/年份的第一行添加注释
library(tidyr); library(dplyr)
my_data %>%
select(-note1, -note2) %>%
group_by(name, workplace, year) %>%
mutate(job_num = row_number()) %>%
ungroup() %>%
pivot_wider(names_from = job_num, values_from = job, names_prefix = "job.") %>%
left_join(my_data %>% distinct(name, workplace, year, .keep_all = TRUE))
结果:
# A tibble: 5 x 9
name workplace year job.1 job.2 job.3 note1 note2 job
<chr> <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr>
1 Ben Alpha 2011 director NA NA xxxx xx director
2 Ben Beta 2011 director vice president NA xx xxx director
3 Wendy Sigma 2011 director vice president CEO xxxx x director
4 Alice Beta 2011 staff NA NA xxx x staff
5 Alice Beta 2012 deputy director NA NA xx xx deputy director
#一个tible:5 x 9
工作地点名称年份职务。1职务。2职务。3备注1备注2职务
1 Ben Alpha 2011董事NA NA xxxx xx董事
2 Ben Beta 2011董事副总裁NA xx xxx董事
3 Wendy Sigma 2011董事副总裁首席执行官xxxx x董事
4名Alice Beta 2011员工NA NA xxx x员工
5 Alice Beta 2012副主任NA NA xx副主任
这里有一种使用dplyr
和tidyr
的方法。首先,我删除notes字段以分别处理这些字段。然后,我为名称/工作场所/年份组中的每个工作行分配一个行号。然后根据这些作业展开列。最后,从每个姓名/工作场所/年份的第一行添加注释
library(tidyr); library(dplyr)
my_data %>%
select(-note1, -note2) %>%
group_by(name, workplace, year) %>%
mutate(job_num = row_number()) %>%
ungroup() %>%
pivot_wider(names_from = job_num, values_from = job, names_prefix = "job.") %>%
left_join(my_data %>% distinct(name, workplace, year, .keep_all = TRUE))
结果:
# A tibble: 5 x 9
name workplace year job.1 job.2 job.3 note1 note2 job
<chr> <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr>
1 Ben Alpha 2011 director NA NA xxxx xx director
2 Ben Beta 2011 director vice president NA xx xxx director
3 Wendy Sigma 2011 director vice president CEO xxxx x director
4 Alice Beta 2011 staff NA NA xxx x staff
5 Alice Beta 2012 deputy director NA NA xx xx deputy director
#一个tible:5 x 9
工作地点名称年份职务。1职务。2职务。3备注1备注2职务
1 Ben Alpha 2011董事NA NA xxxx xx董事
2 Ben Beta 2011董事副总裁NA xx xxx董事
3 Wendy Sigma 2011董事副总裁首席执行官xxxx x董事
4名Alice Beta 2011员工NA NA xxx x员工
5 Alice Beta 2012副主任NA NA xx副主任
另一种方法不使用pivot
方法。在这里,您可以根据需要使用first
或last
或notes
字段的任何聚合函数。您可以使用适当的参数使所有警告静音
df %>% group_by(name, workplace, year) %>%
summarise(note1 = last(note1),
note2 = last(note2),
job = toString(job), .groups = 'drop') %>%
separate(job, into = paste0('Job', seq_len(max(1 + str_count(.$job, ',')))),
sep = ', ',
extra = "drop",
fill = 'right')
# A tibble: 5 x 8
name workplace year note1 note2 Job1 Job2 Job3
<chr> <chr> <int> <chr> <chr> <chr> <chr> <chr>
1 Alice Beta 2011 xxx x staff NA NA
2 Alice Beta 2012 xx xx deputy director NA NA
3 Ben Alpha 2011 xxxx xx director NA NA
4 Ben Beta 2011 xxx xxxx director vice president NA
5 Wendy Sigma 2011 x xxx director vice president CEO
df%>%分组依据(姓名、工作地点、年份)%>%
总结(注1=最后一次(注1),
注2=最后一个(注2),
作业=toString(作业),.groups='drop')%>%
分离(作业,分为=粘贴0('job',seq_len)(最大值(1+str_计数(.$job',,'))),
sep=',',
extra=“drop”,
填充='右')
#一个tibble:5x8
名称工作场所年份注释1注释2作业1作业2作业3
1 Alice Beta 2011 xxx x员工不适用
2 Alice Beta 2012 xx xx副主任NA NA
3 Ben Alpha 2011 xxxx xx董事不适用
4 Ben Beta 2011 xxx xxxx董事副总裁NA
5 Wendy Sigma 2011 x xxx董事副总裁兼首席执行官
另一种方法不使用pivot
方法。在这里,您可以根据需要使用first
或last
或notes
字段的任何聚合函数。您可以使用适当的参数使所有警告静音
df %>% group_by(name, workplace, year) %>%
summarise(note1 = last(note1),
note2 = last(note2),
job = toString(job), .groups = 'drop') %>%
separate(job, into = paste0('Job', seq_len(max(1 + str_count(.$job, ',')))),
sep = ', ',
extra = "drop",
fill = 'right')
# A tibble: 5 x 8
name workplace year note1 note2 Job1 Job2 Job3
<chr> <chr> <int> <chr> <chr> <chr> <chr> <chr>
1 Alice Beta 2011 xxx x staff NA NA
2 Alice Beta 2012 xx xx deputy director NA NA
3 Ben Alpha 2011 xxxx xx director NA NA
4 Ben Beta 2011 xxx xxxx director vice president NA
5 Wendy Sigma 2011 x xxx director vice president CEO
df%>%分组依据(姓名、工作地点、年份)%>%
总结(注1=最后一次(注1),
注2=最后一个(注2),
作业=toString(作业),.groups='drop')%>%
分离(作业,分为=粘贴0('job',seq_len)(最大值(1+str_计数(.$job',,'))),
sep=',',
extra=“drop”,
填充='右')
#一个tibble:5x8
名称工作场所年份注释1注释2作业1作业2作业3
1 Alice Beta 2011 xxx x员工不适用
2 Alice Beta 2012 xx xx副主任NA NA
3 Ben Alpha 2011 xxxx xx董事不适用
4 Ben Beta 2011 xxx xxxx董事副总裁NA
5 Wendy Sigma 2011 x xxx董事副总裁兼首席执行官
请提供您的输入数据作为dput()的输出。
。另外,请查看tidyr
软件包中的pivot\u wide()
在线文档。请提供您的输入数据作为dput()
的输出。另外,在tidyr
包中的pivot_wide()
上查看在线文档。另一种方法(可能稍微简化此代码)是透视多个变量,最后是note1.1
,note1.2
,note2.1
,等等。另一种方法(可能稍微简化此代码)是透视多个变量,最后是note1.1
,note1.2
,note2.1
,等等。我添加了sep=',
以确保它正确地分隔了作业。我添加了sep=',
以确保它正确地分隔了作业