R - 从数据帧循环索引

时间:2017-08-10 15:28:04

标签: r list for-loop dataframe indexing

我正在尝试从数据框中循环一组索引 数据框只有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

这不是我所期待的。 第一个列表没问题,但无法判断第二个列表发生了什么。

1 个答案:

答案 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))和值的向量。

关于此示例函数的注释:

  1. 我故意将ab参数(索引)放在中,以便在lapply中使用更短的符号。请注意,lapply(vars, func, df$x)已扩展为lapply(vars, function(a) func(a, df$x)),因此我认为它在上面有点可读性。如果func中的参数被撤消,则您无法使用缩写格式,而是需要lapply(vars, function(a) func(df$x, a))

  2. 可能有更好的方法来取得该范围的平均值;这是一个简单的例子,展示如何扩展它。