2017-09-06 18 views
2

私は2つのデータフレームs1とs2を持っています。私は一致するIDに基づいてs3を生成したい。あるデータフレームから別のデータフレームへの列のサブセットのコピー

> s1 
    Type id status 
1 B 3  0 
2 B 4  0 
3 S 2  1 
4 B 1  2 

> s2 
    id status 
1 3  88 
2 4  99 


> s3 
    Type id status 
1 B 3  88 
2 B 4  99 
3 S 2  1 
4 B 1  2 


s1=data.frame('Type'=c('B', 'B', 'S', 'B'), 'id'=c(3,4,2,1), 'status'=c(0,0,1,2)) 
s2=data.frame('id'=c(3,4), 'status'=c(88,99)) 

私はこのような何かを試してみましたが、そのは、IDSを注文された場合にのみ

s1[s1$id %in% match(s2$id,s1$id),]$status <- s2$status 
+0

あなたはまた 'match'使用することができます:' S1の$のステータスを[一致(S1ます$ ID、S2 $ id、nomatch = 0)] < - s2 $ status [match(s2 $ id、s1 $ id、nomatch = 0)] 'となります。 – lmo

答えて

1

s1$status <- ifelse(is.na(match(s1$id, s2$id)), s1$status, s2$status[match(s1$id, s2$id)]) 

    Type id status 
1 B 3  88 
2 B 4  99 
3 S 2  1 
4 B 1  2 
0

またはdplyrを使用してみてください仕事に行く:

library(dplyr) 

s1 <- data.frame('Type'=c('B', 'B', 'S', 'B'), 'id'=c(3,4,2,1), 'status'=c(0,0,1,2)) 
s2 <- data.frame('id'=c(3,4), 'status'=c(88,99)) 

s3 <- left_join(s1, s2, by = "id", suffix = c('_s1', '_s2')) %>% 
    mutate(status = coalesce(status_s2, status_s1)) %>% 
    select(-status_s1, -status_s2) 

s3 
+0

ありがとうございますが、dplyrを使用しないことをおすすめします。 –

1

を置き換えるステータス値

次を作成します
s3 <- data.frame(s1[,1:2],status=rowSums(merge(s1,s2,by='id',all=T,sort=F)[,3:4], na.rm = T)) 

:あなたはmergerowSumsを使用することができ、常に0である

Type id status 
1 B 3  88 
2 B 4  99 
3 S 2  1 
4 B 1  2 
+0

ステータス値は何も指定できません。 –

関連する問題