我是一个绝对的初学者,我希望有人能够帮助我解决一个合并问题,这个问题我在今晚的大部分时间里都被困住了,到目前为止还无法成功地调整解决方案来解决与此类似的问题具体例子。
我制作了一个虚拟数据框和矢量来帮助说明我的问题:
dumdata <- data.frame(id=c(1:5), pcode=c(1234,9876,4477,2734,3999), vlo=c(100,450,1000,1325,1500), vhi=c(300,950,1100,1450,1700))
id pcode vlo vhi
1 1234 100 300
2 9876 450 950
3 4477 1000 1100
4 2734 1325 1450
5 3999 1500 1700
vkey <- c(105,290,513,1399,1572,1683)
在 vkey 的值落在变量 vlo 和 vhi 之间的情况下,我想输出一个包含 dumdata 数据的新数据帧。实际上,vkey 的值总是落在 vlo-vhi 范围内,并且范围总是离散的。
所需的输出如下所示:
id pcode vlo vhi vkey
1 1234 100 300 105
1 1234 100 300 290
2 9876 450 950 513
4 2734 1325 1450 1399
5 3999 1500 1700 1572
5 3999 1500 1700 1683
最佳答案
无需使用 for
循环,您可以使用 sapply
一次性构建整个索引向量。
ind <- sapply(vkey, function(x) which(dumdata$vlo < x & x < dumdata$vhi))
data.frame(dumdata[ind,], vkey)
id pcode vlo vhi vkey
1 1 1234 100 300 105
1.1 1 1234 100 300 290
2 2 9876 450 950 513
4 4 2734 1325 1450 1399
5 5 3999 1500 1700 1572
5.1 5 3999 1500 1700 1683
如果 vkey
中的任何值与 dumdata
中的多行匹配,它会变得更丑陋,因为您需要使用 lapply
而不是 sapply然后做
data.frame(dumdata[unlist(ind),], rep(vkey, sapply(vkey, length)))
返回所有匹配项,但我从示例中得出它不会发生。
编辑:
为了完整起见,我要补充一点,你也可以使用 mapply
,但这主要是为了你需要与多个变量进行比较的情况(比如你有 vkey1
和 vkey2
需要一起满足一个条件)。
ind <- mapply(function(x, y) which(dumdata$vlo < x & y < dumdata$vhi),
vkey1, vkey2)
关于r - 基于向量键合并数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19119022/