我正在尝试从数据框中循环一组索引 数据框只有1列。
X
1
2
3
...
考虑以下变量 vars ,它包含数据框中的一些索引:
$1
[1] 1 28
$2
[1] 29 61
我正在尝试遍历其中的每一个并将函数应用于数据框中的每个值
例如,我试图循环索引1到28,然后应用一个函数,然后循环索引29到61,应用不同的函数等等...
这就是我尝试过的。
z = list()
for (i in 1:length(vars)) {
z[[i]] <- i
for (j in vars[[i]][1]:vars[[i]][2]) {
z[[i]][j] <- j
}
}
在将函数应用于数据框之前,以及其他所有内容。我首先想知道我是否得到了正确的索引,但这就是我得到的。
[[1]]
[1] 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
[[2]]
[1] 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 29 30 31 32 33 34 35
[36] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
这不是我所期待的。 第一个列表没问题,但无法判断第二个列表发生了什么。
答案 0 :(得分:1)
使用lapply
:
df <- data.frame(x=1:100)
vars <- list(c(1,28), c(29,61))
str(lapply(vars, function(i) df$x[ i[1]:i[2] ]))
# List of 2
# $ : int [1:28] 1 2 3 4 5 6 7 8 9 10 ...
# $ : int [1:33] 29 30 31 32 33 34 35 36 37 38 ...
(使用str
是为了缩短此显示。)
如果要对1:28
范围内的每个值应用一些任意函数(例如),请在函数内部执行其他操作。例如:
func <- function(ab, x) { mean(x[ ab[1]:ab[2] ]); }
str(lapply(vars, func, df$x))
# List of 2
# $ : num 14.5
# $ : num 45
这里,func
是一个设计的任意函数,它带有两个参数:索引的长度为2的向量(即c(1,28)
)和值的向量。
关于此示例函数的注释:
我故意将ab
参数(索引)放在中,以便在lapply
中使用更短的符号。请注意,lapply(vars, func, df$x)
已扩展为lapply(vars, function(a) func(a, df$x))
,因此我认为它在上面有点可读性。如果func
中的参数被撤消,则您无法使用缩写格式,而是需要lapply(vars, function(a) func(df$x, a))
。
可能有更好的方法来取得该范围的平均值;这是一个简单的例子,展示如何扩展它。