在R中运行迭代以创建具有特定条件的新变量

在R中运行迭代以创建具有特定条件的新变量,r,iteration,recode,R,Iteration,Recode,因此,我有这些数据,我想做的是创建一个变量,该变量将反映每个给定年份中地位最高的群体。每个组的状态可以是: *1=垄断, *2=主导, *3=高级, *4=初级或高级 *5=被歧视。 1岁或2岁的群体将自动获得最高地位,因为每个国家在任何给定年份都只有一个群体拥有该地位。然而,有些国家有多个属于3的群体(有时,3也是该国当年能够达到的最高群体地位),在这种情况下,我希望将规模最大的群体编码为地位最高的群体。我该怎么做呢 数据 D1 <- data.frame(row = c(1, 2,

因此,我有这些数据,我想做的是创建一个变量,该变量将反映每个给定年份中地位最高的群体。每个组的状态可以是: *1=垄断, *2=主导, *3=高级, *4=初级或高级 *5=被歧视。 1岁或2岁的群体将自动获得最高地位,因为每个国家在任何给定年份都只有一个群体拥有该地位。然而,有些国家有多个属于3的群体(有时,3也是该国当年能够达到的最高群体地位),在这种情况下,我希望将规模最大的群体编码为地位最高的群体。我该怎么做呢

数据

 D1 <- data.frame(row = c(1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),
           country = c("US", "US", "US", "US", "US", "US", "US", "US","US", "US", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada"),
           year = c(1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995), 
           group = c("White", "White", "White", "White", "White", "Latino", "Latino", "Latino", "Latino", "Latino","English", "English", "English", "English", "English", "French", "French", "French", "French", "French"), 
           groupstatus = c("1", "1", "1", "3", "3", "5", "5","5", "3", "3", "2", "2", "2", "3", "3", "3", "3", "3", "3", "4"), 
           groupsize= c(0.7, 0.7, 0.7, 0.7, 0.7, 0.15, 0.15, 0.15, 0.15, 0.15, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2))

D1这里是一种使用
data.table的方法

我们将“data.frame”转换为“data.table”(
setDT(D1)
)。按“国家”和“年份”分组,我们根据“groupstatus”中的值1和2创建一个二进制列“highest”(也可以一步完成,但为了便于理解,我将其拆分)

在下一步中,通过相同的列进行分组,我们检查“groupstatus”中的所有元素是否都是3(
all(groupstatus==3)
)。如果是这种情况,我们会得到最大“groupsize”的逻辑索引(
groupsize==max(groupsize)
)或
else
(即如果“groupstatus”中的某些值不是3),我们会查找具有“highest”值的组都是“0”或“FALSE”(
!any(highest)
)并且“groupstatus”是3(
groupstatus==3
)。生成的逻辑向量可以通过
.I
更改为“数值”行索引。我们提取行索引列(
$V1
),并使用它将“highest”中的值更改为1

 setDT(D1)[, highest := +(groupstatus %in% 1:2) , .(country, year)]
 indx <- D1[, .I[if(all(groupstatus==3)) groupsize==max(groupsize) 
     else !any(highest)& groupstatus==3], .(country, year)]$V1
 D1[indx, highest := 1L]
setDT(D1)[,最高:=+(组状态%1:2),(国家,年份)]

indx Hello Akrun,我一直在仔细检查我的数据,出于某种原因,这段代码正在将所有groupstatus==3转换为最高值,而不是给定年份中最大的一个,因为该年份没有1或2。你知道这是为什么吗?@rbeginner我们可以检查的一个方法是用一个模仿它的例子。你能用一个新的例子来更新它吗?这个例子理论上会模拟这个问题,但是当在完整的数据集中运行它时,似乎有问题。我不太清楚如何做到这一点,但每个国家每年最后只有一个群体是至关重要的。我将发布数据子集的dput()。也许这会有帮助。
 setDT(D1)[, highest := +(groupstatus %in% 1:2) , .(country, year)]
 indx <- D1[, .I[if(all(groupstatus==3)) groupsize==max(groupsize) 
     else !any(highest)& groupstatus==3], .(country, year)]$V1
 D1[indx, highest := 1L]