Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的数据帧部分合并_R_Dataframe_Dplyr - Fatal编程技术网

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=',
以确保它正确地分隔了作业