关于r:按组匹配另一个变量的第一行的变量的值

Value of a variable matching the first row of another variable by group

本问题已经有最佳答案,请猛点这里访问。

就像标题中一样,我希望有一个过程可以让我将第一变量的一组唯一值分配给第二变量的最常见值,并与第三值的第一行匹配。示例:

1
2
3
4
5
6
   Name      Year      Job
   Alicia    1990      Butcher
   Alicia    1991      Baker
   George    1989      Scientist
   George    1990      Banker
   George    1991      Banker

我想轻松地确定每个唯一名称所做的第一项工作:

1
2
3
4
5
6
   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


我们可以为此使用data.table

1
2
3
4
5
6
7
8
9
10
11
12
library(data.table)

setDT(df1)[order(Year),FirstJob:=Job[1],.(Name)][]
## or using which.min instead of ordering as akrun suggested:
# setDT(df1)[,FirstJob:=Job[which.min(Year)], .(Name)][]

 #>       Name Year       Job  FirstJob
 #>  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

数据:

1
2
3
4
5
6
7
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


我们可以通过\\'Name \\'分组并提取first \\'Job \\'以创建新列\\'FirstJob \\'

1
2
3
4
5
6
7
8
9
10
11
12
13
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

如果未订购\\'Year \\'

1
2
3
df1 %>%
   group_by(Name) %>%
   mutate(FirstJob = Job[which.min(Year)])

数据

1
2
3
4
5
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))