根据行索引选择两组列

时间:2018-07-24 18:20:07

标签: r dataframe indexing subset

工作示例是显示我正在寻找的最佳方法。

Given input df
df <- data.frame( l = letters[1:10], n = 1:10)
   l  n
1  a  1
2  b  2
3  c  3
4  d  4
5  e  5
6  f  6
7  g  7
8  h  8
9  i  9
10 j 10

我想根据起始索引和长度的向量从列l中选择行。例如

start <- c(2, 4)
len <- 2

我想获取输出

b c
d e

我尝试过

df[(start):(start+len),1]
[1] b c d
Levels: a b c d e f g h i j
Warning messages:
1: In (start):(start + len) :
  numerical expression has 2 elements: only the first used
2: In (start):(start + len) :
  numerical expression has 2 elements: only the first used

应用也不起作用。

apply(start, 1, function(x, d) {d[x:(x+2),1]}, d = df)
Error in apply(start, 1, function(x, d) { : 
  dim(X) must have a positive length

2 个答案:

答案 0 :(得分:1)

我们可以在'start'上使用lapply来获得seq,其中length.out被指定为'len'。然后将“ l”提取为vector

df$l[unlist(lapply(start, function(x) seq(x, length.out =len)))]

或作为list s中的vector

lapply(start, function(x) as.character(df$l)[seq(x, length.out = len)])

答案 1 :(得分:0)

这里有两个选项可以获取您指定的确切输出,但是首先请确保df $ l不是一个因数。

df <- data.frame(l = letters[1:10], n = 1:10, stringsAsFactors = FALSE)
start <- c(2, 4)
len <- 2

for (s in start) {cat(df[s:(s+len-1), 1]); cat("\n")}
# b c
# d e

cat(sapply(start, function(x) {paste(df[x:(x+len-1), 1], collapse = " ")}), sep = "\n")
# b c
# d e