2016-04-11 11 views
0

Ich habe zwei Datenrahmen, A und B. Der erste Datenrahmen enthält Jahre, Gruppennamen und Namen. Der zweite Datenrahmen zeichnet die vollständigen Gruppenlisten auf. Ich möchte eine Variable in einem Datenrahmen erstellen. Wenn ein Name in einem Datenrahmen in der B- Jahres-/Gruppenliste erscheint, sollte er mit "Y" oder "N" gekennzeichnet werden.Mit dplyr :: muate eine neue Spalte, die zwei Datenrahmen vergleicht

Ein Datenrahmen und B Datenrahmen sind:

A <- data.frame(year = c("2000", "2000", "2000", "2000", "2002", "2002", "2003", "2003", "2003"), group = c("Star", "Star", "Sun", "Sun", "Mars", "Earth", "Earth", "Star", "Star"), name = c("John", "Bill", "Summer", "Evans", "Ben", "Mary", "Kally", "John", "Carl")) 
B <- data.frame(year = c("2000", "2000", "2000", "2000", "2000", "2002", "2002","2002", "2003", "2003", "2003", "2003", "2003"), group = c("Star", "Star", "Star", "Sun", "Sun", "Mars", "Mars","Earth", "Earth", "Star", "Star", "Star", "Star"), namelist = c("John", "Helen", "Gray", "Summer", "Evans", "Kevin", "Ben", "Ring", "Steve", "Billy", "Carl", "Michel", "John")) 

Zum Beispiel im Jahr 2000, zeigt B Datenrahmen, dass Star John, Helen und Grau hat. Da der Star eines Datenrahmens im Jahr 2000 John und Carl hat, sind die ersten beiden Zeilen eines Datenrahmens die beiden Variablen "Y" und "N". Das Ergebnis sollte so aussehen:

year group name in_the_list 
1 2000 Star John Y 
2 2000 Star Bill N 
3 2000 Sun  Summer Y 
4 2000 Sun  Evans Y 
5 2002 Mars Ben  Y 
6 2002 Earth Mary N 
7 2003 Earth Kally N 
8 2003 Star John Y 
9 2003 Star Carl Y 
+0

Darf ich fragen, warum Sie dplyr :: mutate anstatt Basisfunktionen verwenden müssen? Übrigens gibt es einen Tippfehler (Evens statt Evans) in Ihrem data.frame B – chinsoon12

+0

Wenn dplyr :: mutate nicht notwendig ist, dann können Sie folgendes tun: 'B $ in_der_liste <-" Y "' ___ 'neu <- merge (A, B, by.x = c ("Jahr", "Gruppe", "Name"), by.y = c ("Jahr", "Gruppe", "Namensliste"), all.x = TRUE) ' ___ ' neues $ in_the_list <- ifelse (is.na (neues $ in_the_list), "N", "Y") ' – winampman

Antwort

1

die Spalten einfügen IDs zu bilden und prüfen, ob es in B existiert

mit dplyr Paket:

mutate(A, in_the_list=c("N", "Y")[paste(year,group,name) %in% Reduce(paste, B) + 1]) 

mit Basisfunktionen:

A$in_the_list <- c("N", "Y")[Reduce(paste, A) %in% Reduce(paste, B) + 1] 
0

Sie können die dplyrsemi_join nutzen, die die Zeilen von o zurückgibt ne data.frame, die in einem anderen sind:

library(dplyr) 

full_join(A, semi_join(A, rename(B, name = namelist)) %>% 
       mutate(in_the_list = TRUE)) %>% 
    mutate(in_the_list = !is.na(in_the_list)) 

# year group name in_the_list 
# 1 2000 Star John  TRUE 
# 2 2000 Star Bill  FALSE 
# 3 2000 Sun Summer  FALSE 
# 4 2000 Sun Evans  FALSE 
# 5 2002 Mars Ben  TRUE 
# 6 2002 Earth Mary  FALSE 
# 7 2003 Earth Kally  FALSE 
# 8 2003 Star John  TRUE 
# 9 2003 Star Carl  FALSE 
1

Hier ist ein dplyr zentrierte Antwort mit mutieren die Trias des Jahres, Gruppe und Namen in eine eindeutige ID-Variable in beiden A und B Tabellen zu transformieren, wobei dann ein left_join, um Beobachtungen in A zu identifizieren, die dasselbe Jahr/dieselbe Gruppe/denselben Namen haben.

library(dplyr) 

A <- A %>% 
    mutate(ygn=paste0(year,group,name)) 

B <- B %>% 
    mutate(ygn=paste0(year,group,namelist)) %>% 
    mutate(inthelist="Y") %>% 
    select(ygn, inthelist) 

Newtbl <- left_join(A,B, by="ygn") %>% 
    select(year,group,name,inthelist) %>% 
    mutate(inthelist=ifelse(is.na(inthelist),"N",inthelist)) 



Outputs: 
    year group name inthelist 
1 2000 Star John   Y 
2 2000 Star Bill   N 
3 2000 Sun Summer   Y 
4 2000 Sun Evans   Y 
5 2002 Mars Ben   Y 
6 2002 Earth Mary   N 
7 2003 Earth Kally   N 
8 2003 Star John   Y 
9 2003 Star Carl   Y 
Verwandte Themen