For-loop并将结果存储在R中的数组中

时间:2015-01-06 16:53:08

标签: r for-loop

假设我的数据框由一个变量(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

由于

3 个答案:

答案 0 :(得分:3)

一种方法是循环(sapply)数字(2:7),检查df$x中的哪些元素小于(<)“数字”使用数字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)

答案 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部分确保您仅使用低于或等于的数字。