2017-02-21 34 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

В конце я использовал это пение le string. –

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

Вы можете использовать group_by() и summarize() функции в 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#