在R中选择行及其相邻行

时间:2014-09-11 14:54:04

标签: 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", "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")))

我正在寻找&#34; b&#34;在第6栏和&#34; a&#34;在第7栏。选择这些实例可以通过以下命令完成:

rows <- df[which(df[,6] == "b"& df[,7] =="a"),]

但我不确定如何选择两个较高和两个较低的实例(尤其是第一个符合条件的匹配具有一个更高的实例)。这应该是基本的,但我无法找到一个好方法。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

一种方法是:

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"

更新

感谢@Ananda Mahto在代码中找到bug并提供更短,更紧凑的代码。

indx1 <- Filter(function(x) x > 0, unique(unlist(lapply(indx, "+", -2:2))))
df[indx1,]

答案 1 :(得分:2)

我编写了一个名为getMyRows的函数,它是my GitHub-only "SOfun" package的一部分。本质上它是@ akrun答案的概括,它的行为有点不同 - 它导致list(因为我设想的行为是将相关行保持在一起)。

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

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安装软件包的方法)。