2017-12-14 13 views
1

2つのデータフレームがあります。特定の列の値が最初のデータフレームの条件を満たす他のデータフレームのすべての行に1つの列の値を追加する必要があります。2つのデータフレーム間の条件に基づいて新しい列に値を割り当てる

DF1:

a b 
x 23 
s 34 
v 15 
g 05 
k 69 

DF2:

x y z 
1 0 10 
2 10 20 
3 20 30 
4 30 40 
5 40 50 
6 50 60 
7 60 70 

所望の出力:私のデータセットで

a b n 
x 23 3 
s 34 4 
v 15 2 
g 05 1 
k 69 7 

間隔が大きく、それがDF1からの値が正確であるとは考えにくいですdf2区間の境界上にある。

df1のすべての行について、本来の範囲に該当する番号をdf2に割り当てる必要があります。したがって、df1$bdf2$ydf2$zの間にある場合は、出力$ nの値をdf2$xの対応する値として割り当てます。これは非常に言葉の問題ですので、明確にする必要があるかどうか質問してください。

+0

「df2」の範囲「y-z」に重複がないことに気付きました。それはあなたのデータセットの場合ですか? – AntoniosK

+1

私のデータでは重複しませんが、同じ値で終了します。例: 0-10 10-20 20-30データの間隔が広いので、最初のdfの値のいずれかが、区間境界 – Dan

+0

Coolで正確にヒットすることはほとんどありません。できるだけ代表者としてサンプルを投稿しようとする。これにより、バグの解決策が得られる可能性が低くなります(実際のデータセットに適用された場合)。 :-) – AntoniosK

答えて

1
df1 = read.table(text = " 
a b 
x 23 
s 34 
v 15 
g 05 
k 69 
", header=T, stringsAsFactors=F) 

df2 = read.table(text = " 
x y z 
1 0 10 
2 10 20 
3 20 30 
4 30 40 
5 40 50 
6 50 60 
7 60 70 
", header=T, stringsAsFactors=F) 

# function 
f = function(x) min(which(x >= df2$y & x <= df2$z)) 
f = Vectorize(f) 

# apply function 
df1$n = f(df1$b) 

# check updated dataset 
df1 

# a b n 
# 1 x 23 3 
# 2 s 34 4 
# 3 v 15 2 
# 4 g 5 1 
# 5 k 69 7 
+0

ありがとう!他のすべてのソリューションは失敗しましたが、これは完全に機能しました。 – Dan

0

あなたは試すことができます:

library(tidyverse) 
df1 %>% 
    rowwise() %>% 
    mutate(n=df2[ b > df2$y & b <= df2$z,1]) %>% 
    ungroup() 
# A tibble: 5 x 3 
     a  b  n 
    <chr> <int> <int> 
1  x 23  3 
2  s 34  4 
3  v 15  2 
4  g  5  1 
5  k 69  7 

はすでに、あなたのニーズに応じて<=または>=<または>を変更する必要がコメントしました。

関連する問題