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