2017-06-02 5 views
0

Ich habe einen Datenrahmen, der die Änderungen in den Namen von Unternehmen aufzeichnet. Eine einfache Darstellung wäre:R: Verfolgen von Änderungen über zwei Spalten

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 

Ich möchte alle Änderungen verfolgen, die ein Wert durchläuft. Hier ist eine Ausgabe, die mir dabei helfen kann:

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

Wie kann ich es in R tun? Ich bin neu in R und Programmierung. Es wäre toll, Hilfe zu bekommen.

Die Frage wurde Duplikat How to reshape data from long to wide format?

jedoch markiert, ist es nicht eine exakte Kopie ist. Aus den Gründen: 1. Das hier verwendete Beispiel enthält Daten, die sich über Spalten hinweg ändern. Dies ist bei der Frage der Umformung von Daten nicht der Fall. Hier sind die zwei Spalten voneinander abhängig. 2. Vor der Umgestaltung denke ich, gibt es einen weiteren Schritt: vielleicht geben Sie eine ID für die Änderungen, die stattfinden. Ich bin mir nicht sicher, wie es geht.

Können Sie mir helfen?

+0

Hi Sharvari, es ist hilfreich, wenn Sie ein reproduzierbares Beispiel mit ausführbarem Code hinterlassen (damit wir Ihr Beispiel nicht neu erstellen müssen, indem Sie unseren eigenen Datenrahmencode erstellen). Lesen Sie hier mehr: https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example. Deine Frage ist nicht * ganz * ein Duplikat der Frage, die akrun vorgeschlagen hat, aber es ist nahe, und ich denke, dass du reshape() finden wirst, um wirklich sehr hilfreich zu sein, da du im Grunde Zeitpunktdaten hast. – Joy

+0

Soll die Frage jetzt so schnell wie möglich bearbeiten. Vielen Dank. –

Antwort

0

Können wir davon ausgehen, dass derselbe Name nie erscheint (kommt nie vor wie A-> B-> C und D-> E-> A)? Wenn ja, können Sie Folgendes tun.

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" 

Das Ergebnis ist eine Liste, nicht Datenrahmen, da die Anzahl der Namen Sequenzen nicht eindeutig sein kann (Firmen unterschiedliche Anzahl von Namen haben).

+0

Danke !. Das ist cool :) –

Verwandte Themen