在R中有条件地提取分组项的特定行
我有下面的数据集,它代表了我正在使用的更大的数据集。下面的数据集有3列:“权重”、“提要”和“标志”。权重是一个数值,feed是一个因子变量,flag是我的指标变量。标志的值为0、1或2(最终将是随机的,但请使用下面提供的值) 对于“feed”字段中的哪个因子类别,我想检查“flag”字段。如果'flag'值=2&对于该值的第一次出现,我想为该提要类别取下两个连续的行-如果某个提要类别的最后一行出现2,则什么也不会发生 例如,数据帧的第2行,其中horsebean=160,标志值为2。我将标记第3行和第4行,因为这是在horsebean的值2之后出现的下两行。我需要小心的是,如果在第9行或第10行之前没有出现蚕豆标志值2,我不想意外地从亚麻籽中选择行 理想情况下,创建第4列时会带有某种标志,指示它们是标志值2后面的行 如果有人能帮助我解决这个问题,我将永远感激在R中有条件地提取分组项的特定行,r,R,我有下面的数据集,它代表了我正在使用的更大的数据集。下面的数据集有3列:“权重”、“提要”和“标志”。权重是一个数值,feed是一个因子变量,flag是我的指标变量。标志的值为0、1或2(最终将是随机的,但请使用下面提供的值) 对于“feed”字段中的哪个因子类别,我想检查“flag”字段。如果'flag'值=2&对于该值的第一次出现,我想为该提要类别取下两个连续的行-如果某个提要类别的最后一行出现2,则什么也不会发生 例如,数据帧的第2行,其中horsebean=160,标志值为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