R中行及其相邻行的选择

R中行及其相邻行的选择,r,dataframe,selection,rows,subset,R,Dataframe,Selection,Rows,Subset,我在R中遇到了一个简单的问题。我正在处理一个大数据集,在这个数据集中,我试图选择符合某个条件的任何一行,以及数据框中它上面的两行和它下面的两行。下面是我的数据 df <- structure(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26",

我在R中遇到了一个简单的问题。我正在处理一个大数据集,在这个数据集中,我试图选择符合某个条件的任何一行,以及数据框中它上面的两行和它下面的两行。下面是我的数据

df <- structure(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", 
"22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", 
"33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", 
"44", "45", "46", "47", "48", "49", "50", "a", "b", "a", "a", 
"a", "b", "a", "a", "a", "b", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "b"), .Dim = c(10L, 7L), .Dimnames = list(NULL, c("1", 
"2", "3", "4", "5", "6", "7")))
df一种方法是:

indx <-  which(df[,6] == "b"& df[,7] =="a")
indx1 <- unique(unlist(lapply(indx, function(x) c(seq(x-2,x), x, seq(x, x+2)))))
df[indx1,]
#     1   2    3    4    5    6   7  
#[1,] "1" "11" "21" "31" "41" "a" "a"
#[2,] "2" "12" "22" "32" "42" "b" "a"
#[3,] "3" "13" "23" "33" "43" "a" "a"
#[4,] "4" "14" "24" "34" "44" "a" "a"
#[5,] "5" "15" "25" "35" "45" "a" "a"
#[6,] "6" "16" "26" "36" "46" "b" "a"
#[7,] "7" "17" "27" "37" "47" "a" "a"
#[8,] "8" "18" "28" "38" "48" "a" "a"
library(SOfun)
getMyRows(df, which(df[, 6] == "b" & df[, 7] == "a"), range = -2:2)
# [[1]]
#      1   2    3    4    5    6   7  
# [1,] "1" "11" "21" "31" "41" "a" "a"
# [2,] "2" "12" "22" "32" "42" "b" "a"
# [3,] "3" "13" "23" "33" "43" "a" "a"
# [4,] "4" "14" "24" "34" "44" "a" "a"
# 
# [[2]]
#      1   2    3    4    5    6   7  
# [1,] "4" "14" "24" "34" "44" "a" "a"
# [2,] "5" "15" "25" "35" "45" "a" "a"
# [3,] "6" "16" "26" "36" "46" "b" "a"
# [4,] "7" "17" "27" "37" "47" "a" "a"
# [5,] "8" "18" "28" "38" "48" "a" "a"
一种方法是:

indx <-  which(df[,6] == "b"& df[,7] =="a")
indx1 <- unique(unlist(lapply(indx, function(x) c(seq(x-2,x), x, seq(x, x+2)))))
df[indx1,]
#     1   2    3    4    5    6   7  
#[1,] "1" "11" "21" "31" "41" "a" "a"
#[2,] "2" "12" "22" "32" "42" "b" "a"
#[3,] "3" "13" "23" "33" "43" "a" "a"
#[4,] "4" "14" "24" "34" "44" "a" "a"
#[5,] "5" "15" "25" "35" "45" "a" "a"
#[6,] "6" "16" "26" "36" "46" "b" "a"
#[7,] "7" "17" "27" "37" "47" "a" "a"
#[8,] "8" "18" "28" "38" "48" "a" "a"
library(SOfun)
getMyRows(df, which(df[, 6] == "b" & df[, 7] == "a"), range = -2:2)
# [[1]]
#      1   2    3    4    5    6   7  
# [1,] "1" "11" "21" "31" "41" "a" "a"
# [2,] "2" "12" "22" "32" "42" "b" "a"
# [3,] "3" "13" "23" "33" "43" "a" "a"
# [4,] "4" "14" "24" "34" "44" "a" "a"
# 
# [[2]]
#      1   2    3    4    5    6   7  
# [1,] "4" "14" "24" "34" "44" "a" "a"
# [2,] "5" "15" "25" "35" "45" "a" "a"
# [3,] "6" "16" "26" "36" "46" "b" "a"
# [4,] "7" "17" "27" "37" "47" "a" "a"
# [5,] "8" "18" "28" "38" "48" "a" "a"

我编写了一个函数,名为,它是的一部分。本质上,它是@akrun答案的概括,它的行为有点不同——它产生了一个
列表
(因为我设想的预期行为是将相关行保持在一起)

根据您的数据,使用情况和相关结果如下:

indx <-  which(df[,6] == "b"& df[,7] =="a")
indx1 <- unique(unlist(lapply(indx, function(x) c(seq(x-2,x), x, seq(x, x+2)))))
df[indx1,]
#     1   2    3    4    5    6   7  
#[1,] "1" "11" "21" "31" "41" "a" "a"
#[2,] "2" "12" "22" "32" "42" "b" "a"
#[3,] "3" "13" "23" "33" "43" "a" "a"
#[4,] "4" "14" "24" "34" "44" "a" "a"
#[5,] "5" "15" "25" "35" "45" "a" "a"
#[6,] "6" "16" "26" "36" "46" "b" "a"
#[7,] "7" "17" "27" "37" "47" "a" "a"
#[8,] "8" "18" "28" "38" "48" "a" "a"
library(SOfun)
getMyRows(df, which(df[, 6] == "b" & df[, 7] == "a"), range = -2:2)
# [[1]]
#      1   2    3    4    5    6   7  
# [1,] "1" "11" "21" "31" "41" "a" "a"
# [2,] "2" "12" "22" "32" "42" "b" "a"
# [3,] "3" "13" "23" "33" "43" "a" "a"
# [4,] "4" "14" "24" "34" "44" "a" "a"
# 
# [[2]]
#      1   2    3    4    5    6   7  
# [1,] "4" "14" "24" "34" "44" "a" "a"
# [2,] "5" "15" "25" "35" "45" "a" "a"
# [3,] "6" "16" "26" "36" "46" "b" "a"
# [4,] "7" "17" "27" "37" "47" "a" "a"
# [5,] "8" "18" "28" "38" "48" "a" "a"
需要注意的是:
range
参数应该使用
来编写,以实现您想要执行的操作


使用以下内容安装软件包:

library(devtools)
install_github("SOfun", "mrdwab")

(或者您最喜欢的从GitHub安装软件包的方法)。

我编写了一个名为的函数,它是的一部分。本质上,它是@akrun答案的概括,它的行为有点不同——它产生了一个
列表
(因为我设想的预期行为是将相关行保持在一起)

根据您的数据,使用情况和相关结果如下:

indx <-  which(df[,6] == "b"& df[,7] =="a")
indx1 <- unique(unlist(lapply(indx, function(x) c(seq(x-2,x), x, seq(x, x+2)))))
df[indx1,]
#     1   2    3    4    5    6   7  
#[1,] "1" "11" "21" "31" "41" "a" "a"
#[2,] "2" "12" "22" "32" "42" "b" "a"
#[3,] "3" "13" "23" "33" "43" "a" "a"
#[4,] "4" "14" "24" "34" "44" "a" "a"
#[5,] "5" "15" "25" "35" "45" "a" "a"
#[6,] "6" "16" "26" "36" "46" "b" "a"
#[7,] "7" "17" "27" "37" "47" "a" "a"
#[8,] "8" "18" "28" "38" "48" "a" "a"
library(SOfun)
getMyRows(df, which(df[, 6] == "b" & df[, 7] == "a"), range = -2:2)
# [[1]]
#      1   2    3    4    5    6   7  
# [1,] "1" "11" "21" "31" "41" "a" "a"
# [2,] "2" "12" "22" "32" "42" "b" "a"
# [3,] "3" "13" "23" "33" "43" "a" "a"
# [4,] "4" "14" "24" "34" "44" "a" "a"
# 
# [[2]]
#      1   2    3    4    5    6   7  
# [1,] "4" "14" "24" "34" "44" "a" "a"
# [2,] "5" "15" "25" "35" "45" "a" "a"
# [3,] "6" "16" "26" "36" "46" "b" "a"
# [4,] "7" "17" "27" "37" "47" "a" "a"
# [5,] "8" "18" "28" "38" "48" "a" "a"
需要注意的是:
range
参数应该使用
来编写,以实现您想要执行的操作


使用以下内容安装软件包:

library(devtools)
install_github("SOfun", "mrdwab")

(或者您最喜欢的从GitHub安装软件包的方法)。

这里我得到的索引是第2行和第6行。根据您的条件,应该选择其他哪些行?这是正确的,2和6符合条件。我期待着选择每个命中的后续两个较高和两个较低的实例(如果存在)。因此,选择的行应该是1,2,3,4(因为2是命中)和4,5,6,7,8(因为6是命中)。结果将是与第1行到第8行相同的数据帧。这有意义吗?非常密切相关的问答:这里我得到的索引是第2行和第6行。根据您的条件,应该选择其他哪些行?这是正确的,2和6符合条件。我期待着选择每个命中的后续两个较高和两个较低的实例(如果存在)。因此,选择的行应该是1,2,3,4(因为2是命中)和4,5,6,7,8(因为6是命中)。结果将是与第1行到第8行相同的数据帧。这有意义吗?非常密切相关的问答:答案再简洁不过了,不是吗?谢谢你,伙计@Error404有可能变得更整洁,你永远不知道:-)@Error404,整洁:
indx1所以,我猜
indx1 0,唯一(unlist(lapply(indx,“+”,-2:2)))
…答案不能变得更整洁,是吗?谢谢你,伙计@Error404有可能变得更整洁,你永远不知道:-)@Error404,更整洁:
indx1所以,我猜
indx1 0,唯一(未列出(lappy(indx,“+”,-2:2))
…@akrun,谢谢。我在两年前写了这个函数的前一个版本。。。弗洛德尔对这个问题的回答也可以适用于这个问题。@akrun,谢谢。我在两年前写了这个函数的前一个版本。。。弗洛德尔对这个问题的回答也可以适用于这个问题。