我有很长的数字列表,例如
set.seed(123)
y<-round(runif(100, 0, 200))
我想在列y
中存储超过数据框的x
列中每个值的值的数量:
df <- data.frame(x=seq(0,200,20))
我可以手动计算数字,如下所示:
length(which(y>=20)) #93 values exceed 20
length(which(y>=40)) #81 values exceed 40
等。我知道我可以使用带有x的所有值的for循环,但是有更优雅的方式吗?
我试过了:
df$y <- length(which(y>=df$x))
但这会发出警告,并没有给我所需的输出。
数据框应如下所示:
df
x y
1 0 100
2 20 93
3 40 81
4 60 70
5 80 61
6 100 47
7 120 40
8 140 29
9 160 19
10 180 8
11 200 0
答案 0 :(得分:2)
您可以使用df$x
y
的每个值与sapply
的所有值进行比较
sapply(df$x, function(a) sum(y>a))
#[1] 99 93 81 70 61 47 40 29 18 6 0
#Looking at your output, maybe you want
sapply(df$x, function(a) sum(y>=a))
#[1] 100 93 81 70 61 47 40 29 19 8 0
这是另一种使用outer
的方法,允许对两个向量进行元素比较
rowSums(outer(df$x,y, "<="))
#[1] 100 93 81 70 61 47 40 29 19 8 0
还有一个(来自alexis_laz&#39;评论)
length(y) - findInterval(df$x, sort(y), left.open = TRUE)
# [1] 100 93 81 70 61 47 40 29 19 8 0