2017-02-21 124 views
4

我有两列所有者和用户,两个字符串,两个名称的数据框。每一行代表一种关系。所有者已在论坛上发布了问题,并且用户已重播。当特定用户成为拥有者时,我需要所有用户的列表。重复是好的,列表必须与时间变量存在以来一样。R中的匹配和返回列表

| Owner | User | 
|-------|------| 
| A  | B | 
| A  | C | 
| B  | V | 
| B  | D | 
| C  | A | 

输出将是每行和该输出的该分类后的新字符串列输出。我可以自己做分类。

| 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  | 

我会在Excel中用Return MULTIPLE corresponding values for ONE Lookup Value, Horizontally, in one Row返回。

我必须在R中重现这一点,但无法弄清楚。

由于 普里莫兹

回答

0

与之相似的是别人,split来到介意

“输出” 作为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 

“输出” 作为一个字符串”

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

最后我用这首歌乐弦解决方案。 –

2

我们可以使用sapply并检查它是其中一个User存在于Owner列中的行,并选择相应的值。

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

谢谢,这个工作得很好。 –

0

可以在dplyr使用group_by()summarize()功能。

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#