【问题标题】:Adding values to a data frame conditional on another data frame以另一个数据框为条件向数据框添加值
【发布时间】:2013-11-17 03:35:05
【问题描述】:

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

我有两个数据框,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 行了——我想知道是否有更优雅的解决方案。

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    但一般来说,对于这些区间内合并的情况,我使用 data.tableroll 参数 -

    library(data.table)
    
    # converting data.frames to data.tables
    svalues <- data.table(svalues)
    dvalues <- data.table(dvalues)
    
    # removing state column from dvalues as we will be getting that from svalues
    dvalues[,state := NULL]
    
    #setting keys
    setkeyv(svalues,'stateID')
    setkeyv(dvalues,'districtID')
    
    # merging the data sets based on values in the key columns
    # roll = Inf looks for the previous matching value on the key and merges with that
    # see help entry for data.table to understand more
    svalues[dvalues, roll = +Inf]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2021-04-19
      相关资源
      最近更新 更多