这可能是一个非常简单的问题,但即使浏览了许多类似的帖子,我也很难搞清楚。
我有两个数据框dvalues
和svalues
。
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
值之间。
例如,由于Badgam
和Pulwama
(文件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行 - 我想知道是否有更优雅的解决方案。
谢谢,非常感谢您的回答。
答案 0 :(得分:1)
如果您的间隔始终为千,那么一个简单的解决方法就是 -
dvalues$stateID <- dvalues$districtID - (dvalues$districtID %% 1000)
dvalues <- merge(dvalues, svalues, by = 'stateID')
但总的来说,对于这些合并范围内的情况,我使用data.table
的{{1}}参数 -
roll