2017-08-23 16 views
0

の順に共通の値を選択する:次のように私は2つのデータフレームを持つ2つの等しくないデータフレームを比較して第二のデータフレーム

df1<-data.frame(st=c(1,2,3,4),v1=c(12,14,15,75),v2=c(43,32,12,18)) 

df1 
    st v1 v2 
1 1 12 43 
2 2 14 32 
3 3 15 12 
4 4 75 18 

df2<-data.frame(st=c(1,2,3,4),v1=c(12,24,35,18),v2=c(48,32,121,82),v3=c(53,11,12,75)) 

df2 
    st v1 v2 v3 
1 1 12 48 53 
2 2 24 32 11 
3 3 35 121 12 
4 4 18 82 75 

何私がしたいことは、「ST」欄で、データフレームの両方を一致させることですすなわち、df1のst = 1の場合、v1とv2の対応する値は12 &です。したがって、変数のいずれかにこれらの値が含まれている場合、df2のst = 1の場合、stとdf2の値を選択します。

だから、上の例の出力には、注意すべき

St values 
1  12(coming from v1 in df2) 
2  32(coming from v2 in df2) 
3  12(coming from v3 in df2) 
4  18 75(coming from v1 & v3 in df2) 

重要なことは、あなたがそれを見ることができるように、出力データフレームで選択した変数の順序は、DF2のものとしてあるべき、あるだろうst = 4の場合、df1の値はst = 2と一致する75 & 18ですが、出力は18、df2の次数は75です。また、df2の変数は常にdf1よりも大きくなります。

答えて

1

私が正しくあなたを理解していれば...

ステップ0あなたはあなただけの条件に合う行を選択したいのですが、サンプルデータセットは、少なくとも一つの試合を持っていることを述べたデータ

を準備各行に私はSt = 3に一致するものがないようにそれを微調整し、行が結果に返されないことを実証しました。

df1<-data.frame(st=c(1,2,3,4),v1=c(12,14,15,75),v2=c(43,32,12,18)) 
df2<-data.frame(st=c(1,2,3,4),v1=c(12,24,35,18),v2=c(48,32,121,82),v3=c(53,11,13,75)) 

ステップ1.データセットが

combined.df <- rbind(df1 %>% gather(v, n, -st) %>% mutate(df = "df1"), 
        df2 %>% gather(v, n, -st) %>% mutate(df = "df2")) 

> head(combined.df) 
    st v n df 
1 1 v1 12 df1 
2 2 v1 14 df1 
3 3 v1 15 df1 
4 4 v1 75 df1 
5 1 v2 43 df1 
6 2 v2 32 df1 

ステップ2. &はあなたが機能をマージ使用する場合は、あなたが作成することができます

DF2
res <- combined.df %>% 
    group_by(st) %>% 
    mutate(n = ifelse(df=="df1", n, ifelse(n %in% n[df=="df1"], n, NA))) %>% 
    ungroup() %>% 
    filter(df=="df2", !is.na(n)) %>% 
    arrange(st, v) 
# if you just want the values, you can stop here. 
> res 
# A tibble: 4 × 4 
    st  v  n df 
    <dbl> <chr> <dbl> <chr> 
1  1 v1 12 df2 
2  2 v2 32 df2 
3  4 v1 18 df2 
4  4 v3 75 df2 


# this part formats the result to follow that of the desired output 
res <- res %>% 
    group_by(st) %>% 
    summarise(values = paste(as.character(n), collapse = " ")) %>% 
    ungroup() 
> res 
# A tibble: 3 × 2 
    st values 
    <dbl> <chr> 
1  1  12 
2  2  32 
3  4 18 75 
+0

に動作します!本当にありがとうございます! – bakas

0

からのみマッチしたものを維持比較組み合わせこれと一意のdfは一致します:

new<-merge(df1,df2,by="st") 

new 

    st v1.x v2.x v1.y v2.y v3 
1 1 12 43 12 48 53 
2 2 14 32 24 32 11 
3 3 15 12 35 121 12 
4 4 75 18 18 82 75 

あなたが望むなら、あなたはそれを望むように注文できます。たとえば:

new2<-new[,1:2] 
new2$from<-"from v1" 
names(new2)<-c("st","value","from") 


for(i in 3:ncol(new)){ 
new3<-new[,c(1,i)] 
new3$from<-pasteo("from v",i) 
names(new3)<-c("st","value","from") 
new2<-rbind(new2,new3) 

} 

は、これが最も効率的な方法ではありませんが、あなたは、いくつかのデータを持っている場合、それは完璧に動作

関連する問題