在R中有条件地提取分组项的特定行

在R中有条件地提取分组项的特定行,r,R,我有下面的数据集,它代表了我正在使用的更大的数据集。下面的数据集有3列:“权重”、“提要”和“标志”。权重是一个数值,feed是一个因子变量,flag是我的指标变量。标志的值为0、1或2(最终将是随机的,但请使用下面提供的值) 对于“feed”字段中的哪个因子类别,我想检查“flag”字段。如果'flag'值=2&对于该值的第一次出现,我想为该提要类别取下两个连续的行-如果某个提要类别的最后一行出现2,则什么也不会发生 例如,数据帧的第2行,其中horsebean=160,标志值为2。我将标记第

我有下面的数据集,它代表了我正在使用的更大的数据集。下面的数据集有3列:“权重”、“提要”和“标志”。权重是一个数值,feed是一个因子变量,flag是我的指标变量。标志的值为0、1或2(最终将是随机的,但请使用下面提供的值)

对于“feed”字段中的哪个因子类别,我想检查“flag”字段。如果'flag'值=2&对于该值的第一次出现,我想为该提要类别取下两个连续的行-如果某个提要类别的最后一行出现2,则什么也不会发生

例如,数据帧的第2行,其中horsebean=160,标志值为2。我将标记第3行和第4行,因为这是在horsebean的值2之后出现的下两行。我需要小心的是,如果在第9行或第10行之前没有出现蚕豆标志值2,我不想意外地从亚麻籽中选择行

理想情况下,创建第4列时会带有某种标志,指示它们是标志值2后面的行

如果有人能帮助我解决这个问题,我将永远感激

df =    structure(list(weight = c(179, 160, 136, 227, 217, 168, 108, 
  124, 143, 140, 309, 229, 181, 141, 260, 203, 148, 169, 213, 257, 
  244, 271, 243, 230, 248, 327, 329, 250, 193, 271, 316, 267, 199, 
 171, 158, 248, 423, 340, 392, 339, 341, 226, 320, 295, 334, 322, 
 297, 318, 325, 257, 303, 315, 380, 153, 263, 242, 206, 344, 258, 
368, 390, 379, 260, 404, 318, 352, 359, 216, 222, 283, 332), 
feed = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("casein", "horsebean", "linseed", "meatmeal", 
"soybean", "sunflower"), class = "factor"), flag = structure(c(2L, 
3L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 1L, 1L, 3L, 2L, 3L, 2L, 3L, 
3L, 1L, 2L, 3L, 1L, 2L, 2L, 1L, 2L, 3L, 2L, 3L, 2L, 2L, 2L, 
3L, 3L, 1L, 2L, 1L, 1L, 3L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 
2L, 3L, 3L, 3L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 3L, 3L, 
1L, 3L, 1L, 2L, 3L, 3L, 3L, 1L, 1L, 2L), .Label = c("0", 
"1", "2"), class = "factor")), .Names = c("weight", "feed", 
 "flag"), row.names = c(NA, -71L), class = "data.frame")
还假设随机生成标志值,每个分组值可能出现或不出现标志值2。例如,如果

  df$flag = sample(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20), replace=T, size=nrow(df))

下面是一个简单的
data.table
解决方案

library(data.table)
indx <- setDT(df)[, .I[match(2, flag) + seq_len(2)], by = feed]$V1
df[indx, flag2 := 1][]
#     weight      feed flag flag2
#  1:    179 horsebean    1    NA
#  2:    160 horsebean    2    NA
#  3:    136 horsebean    2     1
#  4:    227 horsebean    2     1
#  5:    217 horsebean    2    NA
#  6:    168 horsebean    0    NA
#  7:    108 horsebean    1    NA
#  8:    124 horsebean    1    NA
#  9:    143 horsebean    1    NA
# 10:    140 horsebean    0    NA
# ...

下面是一个简单的
data.table
解决方案

library(data.table)
indx <- setDT(df)[, .I[match(2, flag) + seq_len(2)], by = feed]$V1
df[indx, flag2 := 1][]
#     weight      feed flag flag2
#  1:    179 horsebean    1    NA
#  2:    160 horsebean    2    NA
#  3:    136 horsebean    2     1
#  4:    227 horsebean    2     1
#  5:    217 horsebean    2    NA
#  6:    168 horsebean    0    NA
#  7:    108 horsebean    1    NA
#  8:    124 horsebean    1    NA
#  9:    143 horsebean    1    NA
# 10:    140 horsebean    0    NA
# ...

下面是一个简单的
data.table
解决方案

library(data.table)
indx <- setDT(df)[, .I[match(2, flag) + seq_len(2)], by = feed]$V1
df[indx, flag2 := 1][]
#     weight      feed flag flag2
#  1:    179 horsebean    1    NA
#  2:    160 horsebean    2    NA
#  3:    136 horsebean    2     1
#  4:    227 horsebean    2     1
#  5:    217 horsebean    2    NA
#  6:    168 horsebean    0    NA
#  7:    108 horsebean    1    NA
#  8:    124 horsebean    1    NA
#  9:    143 horsebean    1    NA
# 10:    140 horsebean    0    NA
# ...

下面是一个简单的
data.table
解决方案

library(data.table)
indx <- setDT(df)[, .I[match(2, flag) + seq_len(2)], by = feed]$V1
df[indx, flag2 := 1][]
#     weight      feed flag flag2
#  1:    179 horsebean    1    NA
#  2:    160 horsebean    2    NA
#  3:    136 horsebean    2     1
#  4:    227 horsebean    2     1
#  5:    217 horsebean    2    NA
#  6:    168 horsebean    0    NA
#  7:    108 horsebean    1    NA
#  8:    124 horsebean    1    NA
#  9:    143 horsebean    1    NA
# 10:    140 horsebean    0    NA
# ...


如果第9行出现2,会发生什么情况?是否只想在单词后面选择一行?是-您想在正在检查的组的标志值=2之后选择以下1-2行。因此,您需要控制以保持在正确的“提要”类别内。因此,在您的示例中,是的,只是多了一行而不是两行,因为选择第二行将使您退出“亚麻籽”提要。不确定是谁将其标记为“OT,因为为什么我的代码不起作用”。。。这里没有不起作用的代码。我想可能是因为您没有显示所需的输出,所以人们对此进行了标记。如果第9行出现2,会发生什么情况?是否只想在单词后面选择一行?是-您想在正在检查的组的标志值=2之后选择以下1-2行。因此,您需要控制以保持在正确的“提要”类别内。因此,在您的示例中,是的,只是多了一行而不是两行,因为选择第二行将使您退出“亚麻籽”提要。不确定是谁将其标记为“OT,因为为什么我的代码不起作用”。。。这里没有不起作用的代码。我想可能是因为您没有显示所需的输出,所以人们对此进行了标记。如果第9行出现2,会发生什么情况?是否只想在单词后面选择一行?是-您想在正在检查的组的标志值=2之后选择以下1-2行。因此,您需要控制以保持在正确的“提要”类别内。因此,在您的示例中,是的,只是多了一行而不是两行,因为选择第二行将使您退出“亚麻籽”提要。不确定是谁将其标记为“OT,因为为什么我的代码不起作用”。。。这里没有不起作用的代码。我想可能是因为您没有显示所需的输出,所以人们对此进行了标记。如果第9行出现2,会发生什么情况?是否只想在单词后面选择一行?是-您想在正在检查的组的标志值=2之后选择以下1-2行。因此,您需要控制以保持在正确的“提要”类别内。因此,在您的示例中,是的,只是多了一行而不是两行,因为选择第二行将使您退出“亚麻籽”提要。不确定是谁将其标记为“OT,因为为什么我的代码不起作用”。。。这里没有不起作用的代码。我想可能是因为你没有显示你想要的输出,所以人们对此表示怀疑。哇,太快了,非常感谢。第一部分正是我想要的。您好,请继续-如果在“标志”列中找不到“2”,我需要如何更改事件中的代码?我当前在事件中收到错误,但未找到特定源组的“2”。您收到了什么错误?它不应该给出任何错误,而只是跳过相应的组。是的,它只是跳过该组,但是当您尝试将结果附加到新列时,您会收到一个错误。例如,如果在运行代码之前设置df$flag=0,您将收到一个错误。不确定您的意思,抱歉。哇,太快了,非常感谢。第一部分正是我想要的。您好,请继续-如果在“标志”列中找不到“2”,我需要如何更改事件中的代码?我当前在事件中收到错误,但未找到特定源组的“2”。您收到了什么错误?它不应该给出任何错误,而只是跳过相应的组。是的,它只是跳过该组,但是当您尝试将结果附加到新列时,您会收到一个错误。例如,如果在运行代码之前设置df$flag=0,您将收到一个错误。不确定您的意思,抱歉。哇,太快了,非常感谢。第一部分正是我想要的。您好,请继续-如果在“标志”列中找不到“2”,我需要如何更改事件中的代码?我当前在事件中收到错误,但未找到特定源组的“2”。您收到了什么错误?它不应该给出任何错误,而只是跳过相应的组。是的,它只是跳过该组,但是当您尝试将结果附加到新列时,您会收到一个错误。例如,如果在运行代码之前设置df$flag=0,您将收到一个错误。不确定您的意思,抱歉。哇,太快了,非常感谢。第一个p