For循环并将结果存储在R中的数组中

For-loop and storing results in an array in R

假设我有一个由一个变量 (x) 组成的数据框

df <- data.frame(x=c(1,2,3,3,5,6,7,8,9,9,4,4))

我想知道有多少个数字小于 2,3,4,5,6,7。 我知道如何使用

手动执行此操作
# This will tell you how many numbers in df less than 4
xnew <- length(df[ which(df$x < 4), ])

我的问题是如何使用 for 循环或其他方法自动执行此操作?我需要将结果存储在一个数组中,如下所示

i   length
2   1
3   2
4   4
5   6
6   7
7   8

谢谢

一种方法是遍历 (sapply) 数字 (2:7),检查 df$x 中的哪些元素小于 (<) "number" 并用数字执行 sumcbind,将给出 matrix 输出

res <- cbind(i=2:7, length=sapply(2:7, function(y) sum(df$x <y)))

或者您可以通过创建 matrix 个数字 (2:7) 进行矢量化,每个数字都按 df 的行数进行复制,执行逻辑运算 <df$x。对矩阵的每一列重复逻辑运算,并使用 colSums 获得列总和。

 length <-  colSums(df$x <matrix(2:7, nrow=nrow(df), ncol=6, byrow=TRUE))

 #or
 #length <- colSums(df$x < `dim<-`(rep(2:7,each=nrow(df)),c(12,6)))
 cbind(i=2:7, length=length)
num = c(2,3,4,5,6,7)
res = sapply(num, function(u) length(df$x[df$x < u]))

data.frame(number=num, 
           numberBelow=res)

矢量化解决方案:

findInterval(2:7*(1-.Machine$double.eps),sort(df$x))

.Machine$double.eps 部分确保您只取小于且不小于或等于的数字。