2016-11-23 85 views
1

我有以下數據集查找值的所有ID

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

我希望複製TRANSACTIONID的價值爲所有這些

所以我想轉換此:

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 

瓦ich是我的理想輸出 因爲在第二行中錯過了id 2的transactionID,所以我將其替換了。

我想這

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(unique(transactionID) =「」))' – alistaire

+0

謝謝alistair,我真的需要一個facepalm – MFR

回答

1

我們可以使用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

隨着基礎R /匹配:

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