循环遍历数据帧

时间:2015-08-10 13:15:05

标签: r for-loop

我有一个包含57列和122行的数据框。对于每一列,我想计算两件事:

1)小于-1的值的数量

(2)小于-1的时间值连续出现三次或更多次。对于例如如果数据是:

dat<-c(1,-1,-1.3,-1.2,-1,0.5,3.2,2.2,-1,-1,0,-4,-3,-2,-1,2)

对于问题的第(1)部分,我这样做了:

bd<-sum(dat< -1)
>5

对于第(2)部分,它很复杂:

tmpdat<-data.frame(values=dat, tmp_vals=dat)
tmpdat$tmp_vals[tmpdat$values<(-1)]<-"lower"
bds<-data.frame(Values=rle(tmpdat$tmp_vals)$values,Sequential=rle(tmpdat$tmp_vals)$lengths)
sum(bds$Sequential >= 3 & bds$Values == "lower")
>1 

我想创建一个循环来为我的数据框的每一列执行此操作。这就是(1)的循环:

for (i in 1:ncol(d.f)){
        d.f[i]<-sum(d.f.[i]< -1)

}

我想在第二部分的循环中创建,但不知道该怎么做。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

对于第一个问题,使用colSums可能更容易。我们得到一个逻辑矩阵,其df1 < -1sum矩阵中的TRUE值为colSums

 colSums(df1< -1, na.rm=TRUE)
如果有一些缺失值(na.rm=TRUE),

NA可以用作可选参数。

我们可以循环(vapply)通过数据集的列('df1')并应用rle(修改自@David Arenburg的评论)

  vapply(df1, function(x) 
          sum(with(rle(x < -1), lengths[values]) > 2), numeric(1))

对于循环列,我们也可以使用lapply/sapply。在这里,我使用vapply,因为它可能更快一点,也更安全(如果有非数字元素,它应该给出错误)。在每列中,我们得到rle x <-1TRUE, FALSE个运行长度,并将lengths的子集与TRUE值(lengths[values])对应,检查是否为大于2(>2)并获得sum