У меня есть фрейм данных ниже:

from<-c("Jack","Bill","Jack","Adam")
to<-c("Lary","Jack","Tom","Lary")
from_group<-c("A","A","A","C")
to_group<-c("B","A","D","B")
A<-data.frame(from,to,from_group,to_group)

  from   to from_group to_group
1 Jack Lary          A        B
2 Bill Jack          A        A
3 Jack  Tom          A        D
4 Adam Lary          C        B

И я хочу объединить первые два столбца в один со всеми уникальными именами, а вторые два столбца в другой со всеми соответствующими группами, например:

  names groups
1  Jack      A
2  Bill      A
3  Adam      C
4  Lary      B
5   Tom      D
r
1
firmo23 2 Мар 2021 в 16:09

2 ответа

Лучший ответ
library( data.table )
L <- lapply(
  split.default( A, gsub( "_group", "", names(A) ) ),
  setnames, new = c("names", "groups" ) )
#summarise
rbindlist(L)[,.(groups = paste0( unique(groups), collapse = ";")), by = names]

#    names groups
# 1:  Jack      A
# 2:  Bill      A
# 3:  Adam      C
# 4:  Lary      B
# 5:   Tom      D
1
Wimpel 2 Мар 2021 в 13:25

Вы можете использовать unique с unlist

unique(data.frame(names=unlist(A[1:2]), groups=unlist(A[3:4])))
#      names groups
#from1  Jack      A
#from2  Bill      A
#from4  Adam      C
#to1    Lary      B
#to3     Tom      D

Или без имени:

unique(data.frame(names=unlist(A[1:2], use.names = FALSE),
                  groups=unlist(A[3:4], use.names = FALSE)))
#  names groups
#1  Jack      A
#2  Bill      A
#4  Adam      C
#5  Lary      B
#7   Tom      D

Или используя имя

i <- endsWith(names(A), "_group")
unique(data.frame(names=unlist(A[!i]), groups=unlist(A[i])))
1
GKi 2 Мар 2021 в 13:37