我有两个数据帧。在第一个中,我有一些每个GROUP的阈值(FROM和TO)。
FROM TO GROUP
1 99 1
100 199 2
200 399 3
在第二个数据框中,我在X列中有一些值,我想为每个值分配相应的组。
X
50
150
250
我想获得以下输出:
X GROUP
50 1
150 2
250 3
我已经设法通过使用for循环来完成它,但我的真实数据帧有超过200.000行,所以它需要花费很多时间,我还必须多次重复此操作。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:3)
假设您的FROM / TO值没有留下间隙且永远不会重叠,并且所有x值都是整数,并且FROM已经排序 - 这应该可以正常工作。
dd<-data.frame(
FROM=c(1,100,200),
TO=c(99,199,399),
GROUP=c(1,2,3)
)
x <- c(50,150,250,20, 350,110)
g <- dd$GROUP[findInterval(x, dd$FROM)]
cbind(x,g)
有关详细信息,请参阅?findInterval
。在这种情况下,它是一个有用的功能。您可能也对cut
等内容感兴趣。
答案 1 :(得分:1)
正如MrFlick所提到的,这是一个使用cut
的解决方案。
range.df <- data.frame(FROM=c(1,100,200),
TO=c(99,199,399),
GROUP=c(1,2,3))
value.df <- data.frame(ROW=c(1,2,3,4,5,6,7),
X=c(50,150,250,100,90,300,275))
cbind(value.df,GROUP=cut(x=value.df$X,
breaks=c(range.df$FROM,max(range.df$TO)),
labels=range.df$GROUP,
right=FALSE))