おそらく、との組み合わせがwhich()
あなた%in%
を助けます:
dat[which(rownames(dat) %in% c("row.name13")) + c(-1, 1), ]
# col1 col2 col3 col4
# row.name12 A 29 x y
# row.name14 A 77 x y
上記では、「dat」のどの行名が「row.name13」(を使用which()
)であるかを識別しようとしており、 + c(-1, 1)
Rに前の行と後の行を返すように指示しています。行を含めたい場合は、のようなことを行うことができます+ c(-1:1)
。
行の範囲を取得するには、コンマをコロンに切り替えます。
dat[which(rownames(dat) %in% c("row.name13")) + c(-1:1), ]
# col1 col2 col3 col4
# row.name12 A 29 x y
# row.name13 B 17 x y
# row.name14 A 77 x y
アップデート
リストの照合は少し注意が必要ですが、あまり考えずに、次のような可能性があります。
myRows <- c("row.name12", "row.name13")
rowRanges <- lapply(which(rownames(dat) %in% myRows), function(x) x + c(-1:1))
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 2 3 4
#
lapply(rowRanges, function(x) dat[x, ])
# [[1]]
# col1 col2 col3 col4
# row.name11 A 23 x y
# row.name12 A 29 x y
# row.name13 B 17 x y
#
# [[2]]
# col1 col2 col3 col4
# row.name12 A 29 x y
# row.name13 B 17 x y
# row.name14 A 77 x y
これにより、行が重複している可能性があるため便利なsのaが出力されます(この例のようにlist
)。data.frame
更新2:grep
より適切な場合に使用
これがあなたの質問のバリエーションwhich()
です。...%in%
アプローチを使用して解決するのはあまり便利ではありません。
set.seed(1)
dat1 <- data.frame(ID = 1:25, V1 = sample(100, 25, replace = TRUE))
rownames(dat1) <- paste("rowname", sample(apply(combn(LETTERS[1:4], 2),
2, paste, collapse = ""),
25, replace = TRUE),
sprintf("%02d", 1:25), sep = ".")
head(dat1)
# ID V1
# rowname.AD.01 1 27
# rowname.AB.02 2 38
# rowname.AD.03 3 58
# rowname.CD.04 4 91
# rowname.AD.05 5 21
# rowname.AD.06 6 90
AB
ここで、とで行を識別したいとしますAC
が、数値のサフィックスのリストがありません。
このようなシナリオで使用できる小さな関数を次に示します。@Spacedmanから少し借用して、返される行がデータの範囲内にあることを確認します(@flodelの提案による)。
getMyRows <- function(data, matches, range) {
rowMatches = lapply(unlist(lapply(matches, function(x)
grep(x, rownames(data)))), function(y) y + range)
rowMatches = lapply(rowMatches, function(x) x[x > 0 & x <= nrow(data)])
lapply(rowMatches, function(x) data[x, ])
}
次のように使用できます(ただし、ここでは結果を印刷しません)。最初にデータセットを指定し、次に一致させるパターンを指定し、次に範囲(この例では、前に3行、後に4行)を指定します。
getMyRows(dat1, c("AB", "AC"), -3:4)
前のマッチングrow.name12
との例に適用するとrow.name13
、次のように使用できますgetMyRows(dat, c(12, 13), -1:1)
。
関数を変更してより一般的にすることもできます(たとえば、行名の代わりに列との一致を指定するため)。