R函数用于计算值低于特定值的频率

时间:2014-10-10 11:55:06

标签: r function

对于我来说,这对于R脚本没有经验证明是一个怪物。我有一个包含57列,30行数据的数据框

以下是我要做的事情:

1)转到每一栏:

2)计算2/3/4/5/6/7/8/9连续值小于-1的次数

3)将结果打印为文本文件

4)对第二列重复步骤2和3,依此类推

我环顾四周,也看了r stackoverflow

check number of times consecutive value appear based on a certain criteria

这是我的数据的一栏:

data<-c(-0.996,-1.111,-0.638,0.047,0.694,1.901,2.863,2.611,2.56,2.016,0.929,-0.153,-0.617,-0.143
0.199,0.556,0.353,-0.638,0.347,0.045,-0.829,-0.882,-1.143,-0.869,0.619,0.923,-0.474,0.227
0.394,0.789,1.962,1.132,0.1,-0.278,-0.303,-0.606,-0.705,-0.858,-0.723,-0.081,1.206,2.329
1.863,2.1,1.547,2.026,0.015,-0.441,-0.371,-0.304,-0.668,-0.953,-1.256,-1.185,-0.891,-0.569
0.485,0.421,-0.004,0.024,-0.39,-0.58,-1.178,-1.101,-0.882,0.01,0.052,-0.166,-1.703,-1.048
-0.718,-0.036,-0.561,-0.08,0.272,-0.041,-0.811,-0.929,-0.853,-1.047,0.431,0.576,0.642,1.62
2.324,1.251,1.384,0.195,-0.081,-0.335,-0.176,1.089,-0.602,-1.134,-1.356,-1.203,-0.795,-0.752
-0.692,-0.813,-1.172,-0.387,-0.079,-0.374,-0.157,0.263,0.313,0.975,2.298,1.71,0.229,-0.313
-0.779,-1.12,-1.102,-1.01,-0.86,-1.118,-1.211,-1.081,-1.156,-0.972)

当我运行以下代码时:

for (col in 1:ncol(data)) {
    runs <- rle(data[,col])
    print(runs$lengths[which(runs$values < -1)])
 }

它给了我这个:

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

它计算了值的数量&lt; -1但没有运行。这是我错在这里的事吗?

1 个答案:

答案 0 :(得分:1)

(大量编辑)

固定数据向量(缺少逗号):

data <- c(-0.996,-1.111,-0.638,0.047,0.694,1.901,2.863,2.611,2.56,2.016,0.929,-0.153,-0.617,-0.143,
          0.199,0.556,0.353,-0.638,0.347,0.045,-0.829,-0.882,-1.143,-0.869,0.619,0.923,-0.474,0.227,
          0.394,0.789,1.962,1.132,0.1,-0.278,-0.303,-0.606,-0.705,-0.858,-0.723,-0.081,1.206,2.329,
          1.863,2.1,1.547,2.026,0.015,-0.441,-0.371,-0.304,-0.668,-0.953,-1.256,-1.185,-0.891,-0.569,
          0.485,0.421,-0.004,0.024,-0.39,-0.58,-1.178,-1.101,-0.882,0.01,0.052,-0.166,-1.703,-1.048,
          -0.718,-0.036,-0.561,-0.08,0.272,-0.041,-0.811,-0.929,-0.853,-1.047,0.431,0.576,0.642,1.62,
          2.324,1.251,1.384,0.195,-0.081,-0.335,-0.176,1.089,-0.602,-1.134,-1.356,-1.203,-0.795,-0.752,
          -0.692,-0.813,-1.172,-0.387,-0.079,-0.374,-0.157,0.263,0.313,0.975,2.298,1.71,0.229,-0.313,
          -0.779,-1.12,-1.102,-1.01,-0.86,-1.118,-1.211,-1.081,-1.156,-0.972)

执行data < -1为您提供逻辑向量,我们可以计算TRUE&amp; FALSE

runs <- rle(data < -1)

print(runs)

## Run Length Encoding
##   lengths: int [1:21] 1 1 20 1 29 2 8 2 4 2 ...
##   values : logi [1:21] FALSE TRUE FALSE TRUE FALSE TRUE ...

然后仅提取TRUE次运行的长度:

print(runs$lengths[which(runs$values)])
##  [1] 1 1 2 2 2 1 3 1 3 4

并迭代数据帧的列,如前所示:

# make a data frame from sampled versions of data

set.seed(1492) # repeatable

df <- data.frame(V1=data,
                 V2=sample(data, length(data), replace=TRUE),
                 V3=sample(data, length(data), replace=TRUE),
                 V4=sample(data, length(data), replace=TRUE))

# do the extraction

for (col in 1:ncol(df)) {
    runs <- rle(df[, col] < -1)
    print(runs$lengths[which(runs$values)])
}

##  [1] 1 1 2 2 2 1 3 1 3 4
##  [1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1
##  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1
##  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1