假设我的数据框由一个变量(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-loop或其他方法自动执行此操作?我需要将结果存储在数组中,如下所示
i length
2 1
3 2
4 4
5 6
6 7
7 8
由于
答案 0 :(得分:3)
一种方法是循环(sapply
)数字(2:7
),检查df$x
中的哪些元素小于(<
)“数字”使用数字sum
,cbind
执行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)
答案 1 :(得分:1)
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)
答案 2 :(得分:1)
矢量化解决方案:
findInterval(2:7*(1-.Machine$double.eps),sort(df$x))
.Machine$double.eps
部分确保您仅使用低于或等于的数字。