工作示例是显示我正在寻找的最佳方法。
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
答案 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