2017-02-21 3 views
4

Ich habe Datenrahmen mit zwei Spalten Besitzer und Benutzer, beide Strings, beide Namen. Jede Zeile repräsentiert eine Beziehung. Der Besitzer hat eine Frage zum Forum gestellt und der Benutzer hat sie wiederholt. Ich brauche eine Liste aller Benutzer, wenn ein bestimmter Benutzer Eigentümer wird. Duplikate sind in Ordnung, Liste muss gleich sein, da Zeitvariable vorhanden ist.Match-und Return-Liste in R

Ausgabe wäre eine neue String-Spalte Ausgabe für jede Zeile und nach dieser Kategorisierung dieser Ausgabe. Ich kann mich selbst kategorisieren.

| Owner | User | Output | Cat_output | 
|-------|------|--------|------------| 
| A  | B | V,D | indirect | 
| A  | C | A  | direct  | 
| B  | V |  | empty  | 
| B  | D |  | empty  | 
| C  | A | B,C | direct  | 

Ich würde dies in Excel mit Return MULTIPLE corresponding values for ONE Lookup Value, Horizontally, in one Row zurückgeben.

Ich muss dies in R reproduzieren und kann es nicht herausfinden.

Dank Primoz

Antwort

0

In eine ähnliche Richtung wie die anderen, kam split in den Sinn ...

"Output" als list:

df$Output <- with(df, split(User, Owner))[df$User] 
df 
# Owner User Output 
# 1  A B V, D 
# 2  A C  A 
# 3  B V NULL 
# 4  B D NULL 
# 5  C A B, C 

"Output" als eine einzelne Zeichenfolge“

df$Output <- sapply(with(df, split(User, Owner)), toString)[df$User] 
df 
# Owner User Output 
# 1  A B V, D 
# 2  A C  A 
# 3  B V <NA> 
# 4  B D <NA> 
# 5  C A B, C 
+0

Am Ende habe ich dieses singen Le String Lösung. –

2

Wir sapply verwenden und überprüfen, welche sind die Zeilen, in denen ein User in Owner Spalte vorhanden ist, und den entsprechenden Wert auswählen.

df$Output <- sapply(df$User, function(x) df$User[df$Owner %in% x]) 

df 
# Owner User Output 
#1  A B V, D 
#2  A C  A 
#3  B V  
#4  B D  
#5  C A B, C 
+0

Danke, dieses hat gut funktioniert –

0

können Sie verwenden, um die group_by() und summarize() Funktionen in dplyr.

library(dplyr) 

df <- data.frame(owner = c("A", "A", "B", "B", "C"), 
      user = c("B", "C", "V", "D", "A"), 
      stringsAsFactors = FALSE 
      ) 
out <- group_by(df, owner) %>% summarize(output = list(user)) 
left_join(df, out, by = c("user" = "owner")) 

# owner user output 
# 1  A B V, D 
# 2  A C  A 
# 3  B V NULL 
# 4  B D NULL 
# 5  C A B, C#