2016-11-23 6 views
1

I次のデータセットすべてのIDの値を探す

dts1 <- data.frame (id = c(1,2,3,2,1), transactionID =c ("A","","", "B","A")) 

私はそれらのすべてのためのトランザクションIDの値をコピーしたいが

ので、私は、この変換する必要があり:

id transactionID 
1 1    A 
2 2    
3 3    
4 2    B 
5 1    A 

id transactionID 
    1 1    A 
    2 2    B 
    3 3    
    4 2    B 
    5 1    A 

Whのに

ichは私の理想的な出力です id 2のtransactionIDが2番目の行で見逃され、私がそれを置き換えたためです。

私は私に次のようになります。この

library(dplyr) 
dts1 %>% group_by(id) %>% mutate(transactionID = paste(transactionID, collapse="")) 

を試してみました:

id transactionID 
    (dbl)   (chr) 
1  1   AA 
2  2    B 
3  3    
4  2    B 
5  1   AA 
+2

これは本当に素晴らしいアプローチではありませんが、 'transactionID'を' unique'にラップして動作させることができます: 'dts1%>%group_by(id)%>%mutate(transactionID = paste(一意(transactionID)、collapse = "")) ' – alistaire

+0

ありがとうアリスター、私は本当にfacepalmが必要です – MFR

答えて

1

我々は基本R /試合でdata.table

library(data.table) 
setDT(dts1)[, transactionID := if(all(!nzchar(as.character(transactionID)))) transactionID 
     else transactionID[nzchar(as.character(transactionID))][1], by = id] 
dts1 
# id transactionID 
#1: 1    A 
#2: 2    B 
#3: 3    
#4: 2    B 
#5: 1    A 
1

を使用することができます。

lookup <- unique(dts1[dts1$transactionID != '',]) 
dts1$transactionID <- lookup[match(dts1$id, lookup[,1]),2] 
dts1$transactionID[is.na(dts1$transactionID)] <- '' 

dts1 

    id transactionID 
1 1    A 
2 2    B 
3 3    
4 2    B 
5 1    A 
関連する問題