R 按组匹配另一个变量的第一行的变量值

R 按组匹配另一个变量的第一行的变量值,r,dataframe,R,Dataframe,如标题所示,我希望有一个过程,允许我将第一个变量的一组唯一值分配给第二个变量的最常见值,与第三个值的第一行匹配。例如: Name Year Job Alicia 1990 Butcher Alicia 1991 Baker George 1989 Scientist George 1990 Banker George 1991 Banker 我想很容易地确定每

如标题所示,我希望有一个过程,允许我将第一个变量的一组唯一值分配给第二个变量的最常见值,与第三个值的第一行匹配。例如:

   Name      Year      Job
   Alicia    1990      Butcher
   Alicia    1991      Baker
   George    1989      Scientist
   George    1990      Banker
   George    1991      Banker
我想很容易地确定每个唯一名称的第一项工作是什么:

   Name      Year      Job         First Job
   Alicia    1990      Butcher     Butcher
   Alicia    1991      Baker       Butcher
   George    1989      Scientist   Scientist
   George    1990      Banker      Scientist
   George    1991      Banker      Scientist

我们可以按“名称”分组并提取
first
“Job”以创建新列“FirstJob”

library(dplyr)
df1 %>%
   group_by(Name) %>%
   mutate(FirstJob = first(Job))
# A tibble: 5 x 4
# Groups:   Name [2]
#  Name    Year Job       FirstJob 
#  <chr>  <int> <chr>     <chr>    
#1 Alicia  1990 Butcher   Butcher  
#2 Alicia  1991 Baker     Butcher  
#3 George  1989 Scientist Scientist
#4 George  1990 Banker    Scientist
#5 George  1991 Banker    Scientist
数据
df1我们可以按“名称”分组并提取
first
“Job”以创建新列“FirstJob”

library(dplyr)
df1 %>%
   group_by(Name) %>%
   mutate(FirstJob = first(Job))
# A tibble: 5 x 4
# Groups:   Name [2]
#  Name    Year Job       FirstJob 
#  <chr>  <int> <chr>     <chr>    
#1 Alicia  1990 Butcher   Butcher  
#2 Alicia  1991 Baker     Butcher  
#3 George  1989 Scientist Scientist
#4 George  1990 Banker    Scientist
#5 George  1991 Banker    Scientist
数据
df1我们可以使用
数据。表
用于此:

库(data.table)
setDT(df1)[订单(年份),第一个作业:=作业[1],(名称)][]
##或者使用which.min代替akrun建议的顺序:
#setDT(df1)[,FirstJob:=Job[which.min(Year)],(Name)][]
#>姓名年份职务FirstJob
#>1:Alicia 1990屠夫屠夫
#>2:Alicia 1991年面包师屠夫
#>3:George 1989科学家
#>4:George 1990银行家科学家
#>5:George 1991银行家兼科学家
数据:


我们可以使用
data.table
进行此操作:

库(data.table)
setDT(df1)[订单(年份),第一个作业:=作业[1],(名称)][]
##或者使用which.min代替akrun建议的顺序:
#setDT(df1)[,FirstJob:=Job[which.min(Year)],(Name)][]
#>姓名年份职务FirstJob
#>1:Alicia 1990屠夫屠夫
#>2:Alicia 1991年面包师屠夫
#>3:George 1989科学家
#>4:George 1990银行家科学家
#>5:George 1991银行家兼科学家
数据:


你的题目太长了,有点不清楚,与你的问题主体不符。请考虑一个较短,更一般的标题,如果我有什么是不希望的。你的标题是太长,有点不清楚,不匹配你在你的身体问题。请考虑一个较短的,更一般的标题,如果我有什么是不希望的。添加第二个选项,你可以使用:<代码> Frad(…,key = C(“名称”,“年份”))< <代码> >而不是<代码> Read。表< /Cord>,然后执行<代码> DF1[新:=第一(作业),by =名称] < /代码>。@马库斯OP可能已经加载了它们的数据,因此,使用
fread
和跳过
setDT
会导致混淆。如果不使用
fread
,那么我就不喜欢在没有排序的情况下先使用
…[1]
(子集),因为这会假定数据是有序的。谢谢你的回答!如果我想使用模式而不是min呢?(因此,“最常见的工作”而不是“第一份工作”(George=Banker))@Homard您需要创建一个
mode
函数:然后将
job[1]
替换为
getmode(job)
@Homard这适用于您的后续问题:
setDT(df1)[order(Year),FirstJob:=名称(sort(sort)(table(job),discreating=T)[1],(Name)]
,如果没有最常见的工作(Alicia的例子),它不会给你第一个工作。要添加第二个选项,你可以使用:
fread(…,key=c(“Name”,“Year”))
而不是
read.table
,然后执行
df1[,new:=first(job),by=Name]
@markus OP可能已经加载了数据,因此,使用
fread
和跳过
setDT
会导致混淆。如果不使用
fread
,那么我就不喜欢在没有排序的情况下先使用
…[1]
(子集),因为这会假定数据是有序的。谢谢你的回答!如果我想使用模式而不是min呢?(因此,“最常见的工作”而不是“第一份工作”(George=Banker))@Homard您需要创建一个
mode
函数:然后将
job[1]
替换为
getmode(job)
@Homard这适用于您的后续问题:
setDT(df1)[order(Year),FirstJob:=名称(sort(sort)(table(job),discreating=T)[1],(Name)]
,如果没有最普通的工作,它不会给你第一份工作。
df1 <- structure(list(Name = c("Alicia", "Alicia", "George", "George", 
"George"), Year = c(1990L, 1991L, 1989L, 1990L, 1991L), Job = c("Butcher", 
"Baker", "Scientist", "Banker", "Banker")), class = "data.frame", 
row.names = c(NA, 
-5L))
read.table(text="Name      Year      Job
                 Alicia    1990      Butcher
                 Alicia    1991      Baker
                 George    1989      Scientist
                 George    1990      Banker
                 George    1991      Banker",
           header=T, stringsAsFactors=F) -> df1