以另一个数据帧为条件向数据帧添加值

时间:2013-11-17 03:35:06

标签: r

这可能是一个非常简单的问题,但即使浏览了许多类似的帖子,我也很难搞清楚。

我有两个数据框dvaluessvalues

dvalues

district   districtID   value    state
Badgam     1002          30.2    N/A
Pulwama    1012          10.9    N/A
Kangra     2002          10.2    N/A
Amritsar   3015          29.8    N/A
...

svalues

state            stateID
Jammu & Kashmir     1000
Himachal Pradesh    2000
Punjab              3000
....

我想在每行的州列中添加一个值,条件是districtID值介于两个stateID值之间。

例如,由于BadgamPulwama(文件1中的前两个值)的值为districtID介于1000和2000之间,因此州名称应为"Jammu & Kashmir"。同样,ID在2000到3000之间的区Kangra应该有一个州名"Himachal Pradesh"

我的最终结果应该是什么样的:

district   districtID   value    state
Badgam     1002          30.2    Jammu & Kashmir
Pulwama    1012          10.9    Jammu & Kashmir
Kangra     2002          10.2    Himachal Pradesh
Amritsar   3015          29.8    Punjab
...

在许多尝试中,这是唯一有效的方法:

dvalues$state<-
 ifelse(dvalues$districtID<2000,"Jammu & Kashmir", 
  ifelse(dvalues$districtID>2000 & dvalues$districtID<3000,"Himachal Pradesh",
    ifelse(dvalues$districtID>3000 & dvalues$districtID<4000,"Punjab",
      ifelse(dvalues$districtID>4000 & dvalues$districtID<5000,"Chandigarh",
       ...

然而,这是缓慢而丑陋的,更不用说有36行 - 我想知道是否有更优雅的解决方案。

谢谢,非常感谢您的回答。

1 个答案:

答案 0 :(得分:1)

如果您的间隔始终为千,那么一个简单的解决方法就是 -

dvalues$stateID <- dvalues$districtID - (dvalues$districtID %% 1000)
dvalues <- merge(dvalues, svalues, by = 'stateID')

但总的来说,对于这些合并范围内的情况,我使用data.table的{​​{1}}参数 -

roll