从第二个数据帧向数据帧的每一行附加一个类别

时间:2014-05-08 23:04:06

标签: r dataframe

我有两个数据帧。在第一个中,我有一些每个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行,所以它需要花费很多时间,我还必须多次重复此操作。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 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))