我有两个不同的数据集(或向量)。比方说,在其中一个变量中,有几个观察结果:
a<- c(1:30)
然后,在另一个数据集中,我有另一个(小得多的变量),假设只有5个观测值。
ref <- c(5:10)
我想要为每个a创建一个变量,在大于(或等于)的变量中包含ref的最小值,否则生成0。我试过了,但显然行不通。
min <- ifelse(a>=ref, min(ref[a>=ref]), 0)
结果变量应具有与a相同的长度,当a介于1和4之间时为0,当a为5时为5,当a为6时为6。所有数值都在10或10以上。
谢谢你的帮助!
发布于 2018-12-10 05:08:26
对于a
的每个值,我们找到ref
的最近值,如果它存在,它大于或等于a
,否则返回0。
sapply(a, function(x) ifelse(any(x >= ref), max(ref[which(x >= ref)]), 0))
#[1] 0 0 0 0 5 6 7 8 9 10 10 10 10 10 10 10 10 10 10.......
正如@Sotos所建议的那样,我们可以使用嵌套的replace
或ifelse
在没有循环的情况下进行同样的操作。
#Option 1
replace(replace(a, a < min(ref), 0), a > max(ref), max(ref))
#Option 2
ifelse(a < min(ref), 0, ifelse(a > max(ref), max(ref), a))
发布于 2018-12-10 05:08:45
我们可以试试
replace(findInterval(a, ref) + min(ref) - 1, a <= min(ref), 0)
[#1] 0 0 0 0 0 6 7 8 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
或者另一个选择是pmin/pmax
out <- pmin(a, max(ref))
out[out < min(ref)] <- 0
也可以用一行编写
pmin(a, max(ref)) * (a >= min(ref))
https://stackoverflow.com/questions/53706205
复制