Слияние различных фреймов данных из одного столбца - PullRequest
0 голосов
/ 26 мая 2020

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

clusering_matrix_example <- data.frame(BGC = c("BGC1", "BGC2", "BGC3", "BGC4"), Family = c("10","20","30","40"))
network_matrix_example <- data.frame(BGC1 = c("BGC1", "BGC1", "BGC1", "BGC2", "BGC2", "BGC2", "BGC3", "BGC3", "BGC3", "BGC4", "BGC4", "BGC4"),
                                     BGC2 = c("BGC2", "BGC3", "BGC4", "BGC1", "BGC3", "BGC4", "BGC1", "BGC2", "BGC4", "BGC1", "BGC2", "BGC3"),
                                     score = c(1,2,3,1,4,5,2,4,6,3,5,6))
network_output_example <- merge(network_matrix_example, clusering_matrix_example, by.x= "BGC1", by.y = "BGC")

network_output_example <- merge(network_matrix_example, clusering_matrix_example, by.x= "BGC2", by.y = "BGC")

Пример вывода первого DF

BGC1  | BGC2 | score |Family
BGC1    BGC2    1     10
BGC1    BGC3    2     10
BGC1    BGC4    3     10
BGC2    BGC1    1     20
BGC2    BGC3    4     20
BGC2    BGC4    5     20
BGC3    BGC1    2     30
BGC3    BGC2    4     30
BGC3    BGC4    6     30
BGC4    BGC1    3     40
BGC4    BGC2    5     40
BGC4    BGC3    6     40

Желаемый вывод DF

BGC1  | BGC2 | score |Family1 | Family2
BGC1    BGC2    1     10        20
BGC1    BGC3    2     10        30
BGC1    BGC4    3     10        40
BGC2    BGC1    1     20        10
BGC2    BGC3    4     20        30
BGC2    BGC4    5     20        40
BGC3    BGC1    2     30        10
BGC3    BGC2    4     30        20
BGC3    BGC4    6     30        40
BGC4    BGC1    3     40        10
BGC4    BGC2    5     40        20
BGC4    BGC3    6     40        40

Они, возможно, также имеют разную длину, поэтому я бы слил all = TRUE?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Просто измените имя во втором слиянии

clusering_matrix_example <- data.frame(BGC = c("BGC1", "BGC2", "BGC3", "BGC4"), Family = c("10","20","30","40"))

ne1 <- data.frame(BGC1 = c("BGC1", "BGC1", "BGC1", "BGC2", "BGC2", "BGC2", "BGC3", "BGC3", "BGC3", "BGC4", "BGC4", "BGC4"),
                                     BGC2 = c("BGC2", "BGC3", "BGC4", "BGC1", "BGC3", "BGC4", "BGC1", "BGC2", "BGC4", "BGC1", "BGC2", "BGC3"),
                                     score = c(1,2,3,1,4,5,2,4,6,3,5,6))

ne2 <- merge(ne1, clusering_matrix_example, by.x= "BGC1", by.y = "BGC")

network_output_example <- merge(ne2, clusering_matrix_example, by.x= "BGC2", by.y = "BGC")
0 голосов
/ 26 мая 2020
df1 <- merge(network_matrix_example, clusering_matrix_example, by.x= c("BGC1"), by.y = "BGC")

df2 <- merge(df1, clusering_matrix_example, by.x= c("BGC2"), by.y = "BGC")

names(df2)[names(df2)=="Family.x"] <- "Family1"
names(df2)[names(df2)=="Family.y"] <- "Family2"

df3 <- df2[,c("BGC1","BGC2","score","Family1","Family2")]

df4 <- df3[with(df3, order(BGC1,BGC2,score,Family1,Family2)),]

Похоже, желаемый результат.

...