2016-09-04 37 views
-2

實施例:加入和順序列

a b p.a p.b 
1 2 x  y 
3 4 c  d 
2 1 y  x 
5 6 f  e 
1 1 x  x 

我想加入p.ap.b(的ab屬性),因此,如果有發生對ab所有對ba應轉過來成對ab和屬性的順序應保留,然後加入到一個新的列。所以只有前兩列變化,最後兩列也應該改變。我知道我可以使用paste來連接兩列,但我不確定如何正確獲取列條目的順序。

結果應該如下:

a b p.a p.b joined 
1 2 x  y  xy 
3 4 c  d  cd 
1 2 x  y  xy 
5 6 f  e  fe 
1 1 x  x  xx 

並不重要,對於ab行是否1 22 1,但如果有1 2應該沒有2 1反之亦然

+0

您確實需要提供可能變化的數據;你有什麼可以用'paste0'來解決,但這聽起來不像你需要的邏輯。 – alistaire

+0

我認爲這是所有可能的。除了我有更多的元素比1,2,3,4和c,d,x,y。 @akrun的解決方案似乎是我需要的。 – doc

+0

@alistaire如果你不知道我想如何處理某些情況,那會是哪種情況?我想完成表格以使其更清晰。 – doc

回答

1

使用更新的數據集,我們可以遍歷行,根據前兩列元素得到order,根據這兩列獲得列。

df2 <- do.call(rbind, lapply(seq_len(nrow(df1)), function(i) { 
       x1 <- df1[i,] 
       i1 <- order(unlist(x1[1:2])) 
       x1[1:2] <- unlist(x1[1:2])[i1] 
       x1[3:4] <- unlist(x1[3:4])[i1] 
       x1})) 

df2$joined <- do.call(paste0, df2[3:4]) 
df2 
# a b p.a p.b joined 
#1 1 2 x y  xy 
#2 3 4 c d  cd 
#3 1 2 x y  xy 
#4 5 6 f e  fe 
#5 1 1 x x  xx 
+0

好的,所以有這個問題,看看你的第一個解決方案:第三和第四列應該只會改變,如果第一和第二列改變。據我看到'a,b'和'p.a,p.b'只是按字母順序改變。但'p.a'和'p.b'是'a'和'b'的屬性。所以如果有'1 2 y x',它會變成'1 2 x y',對嗎? – doc

+0

@doc我用新的數據集更新瞭解決方案。應用第二種解決方案後,我得到預期產出 – akrun

+0

不,第4行不同。輸出應該是'5 6 f e fe',因爲'f e'只有在'5 6'改變時纔會改變。 '5 6'然而不改變,所以不應該'f e' – doc