これはおそらく非常に単純な質問ですが、多くの同様の投稿を閲覧した後でも、私はそれを理解するのに苦労しています。
2つのデータフレームが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
値が2つのstateID
値の間にあることを条件として、各行の状態列に値を追加したいと思います。
たとえば、Badgam
とPulwama
(ファイル1の最初の2つの値)のdistrictID
値は1000から2000の間であるため、状態名はになります"Jammu & Kashmir"
。同様に、Kangra
IDが2000から3000の間の地区には、州名が必要"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行あることは言うまでもありません。もっとエレガントな解決策があるかどうか疑問に思いました。
ありがとう、私はあなたの答えに本当に感謝します。
間隔が常に1000のままである場合、簡単な回避策は次のようになります-
dvalues$stateID <- dvalues$districtID - (dvalues$districtID %% 1000)
dvalues <- merge(dvalues, svalues, by = 'stateID')
しかし、一般的に、これらの間隔内マージのような状況では、data.table
'roll
引数を使用します-
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]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加