2017-06-02 62 views
0

我有一個數據框,它記錄公司名稱中的更改。一個簡單的表示將是:R:跨兩列的跟蹤更改

df <- data.frame(key = c("A", "B","C", "E","F","G"), Change = c("B", "C","D" ,"F","G","H")) 
print(df) 

    Key Change 
1 A  B 
2 B  C 
3 C  D 
4 E  F 
5 F  G 
6 G  H 

我想跟蹤所有值的變化。這裏有一個輸出可以幫助我這麼做:

Key 1st 2nd 3rd 4th 
1 A B C D 
2 E F G H 

我該如何在R中做到這一點?我是R和編程新手。能夠得到幫助真是太棒了。

問題被標記的How to reshape data from long to wide format?

重複然而,它不是一個確切的重複。出於以下原因: 1.此處使用的示例包含跨列更改的數據。重新塑造數據的問題並非如此。在這裏,這兩列彼此依賴。 2.在重塑之前,我認爲還有另一個步驟:也許爲發生變化提供一個ID。我不知道該怎麼做。

你能幫我嗎?

+0

嗨Sharvari,如果你離開與運行的代碼重複的例子,它是有幫助的(所以我們不必通過創建我們自己的數據幀代碼來重新創建你的例子,說的)。閱讀更多在這裏:https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example。你的問題不是* akrun提出的問題的重複,但它很接近,我認爲你會發現reshape()確實非常有用,因爲你基本上有時間點數據。 – Joy

+0

現在應儘快編輯問題。謝謝。 –

回答

0

我們可以假設,從來沒有出現相同的名稱(永遠不會發生像A-> B-> C和D-> E-> A)?如果是這樣,您可以執行以下操作。

df <- data.frame(key = c("A","B","C", "E","F","G"), 
       Change = c("B","C","D" ,"F","G","H")) 
print(df) 

# mapping from old to new name 
next_name <- as.character(df$Change) 
names(next_name) <- df$key 

all_names <- unique(c(as.character(df$key), as.character(df$Change))) 
get_id <- function(x) { 
    # for each name, repeatedly traverse until the final name 
    ss <- x %in% names(next_name) 
    if (any(ss)) { 
    x[ss] <- get_id(next_name[x[ss]]) 
    } 
    x 
} 
ids <- get_id(all_names) 
lapply(unique(ids), function(i) c(all_names[ids==i])) 

# out come is a list of company names, 
# each entry represents a history of a firm 
##[[1]] 
##[1] "A" "B" "C" "D" 
##[[2]] 
##[1] "E" "F" "G" "H" 

結果是一個列表,而不是數據框,因爲名稱序列的數量可能不是唯一的(公司可能有不同的名稱數量)。

+0

謝謝!這很酷 :) –