объединять файлы на основе одного столбца и разных порядков в R или python - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть 3 разделенных табуляцией файла, как в следующих 3 примерах:

файлы примеров:

AB  45.2    4.56    0.21
FG  78.1    54.1    36.1
HG  98.1    25.0    12.6
TR  1.2 3.25    65.1


TR  5.2 41.6    10.21
HG  8.1 23.1    56.1
FG  9   32.0    32.6
AB  12.2    31.25   5.1


HG  15.2    21.6    20.21
TR  31.1    32.1    66.1
AB  12.1    12.0    62.6
FG  11.3    31.25   54.1

1-й столбец во всех них содержит похожие элементы, но в другом порядке. Я хочу объединить файлы на основе 1-го столбца и создать новый файл, например ожидаемый результат:

ожидаемый результат

AB  45.2    4.56    0.21    12.2    31.25   5.1 12.1    12.0    62.6
FG  78.1    54.1    36.1    9   32.0    32.6    11.3    31.25   54.1
HG  98.1    25.0    12.6    8.1 23.1    56.1    15.2    21.6    20.21
TR  1.2 3.25    65.1    5.2 41.6    10.21   31.1    32.1    66.1

Я пытался использовать функцию join в R and pandas но они не возвращают ожидаемый результат. Вы знаете, как я могу сделать это в python или R?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

В R вы можете использовать Reduce и merge

Reduce(function(x, y) merge(x, y, by = 'V1'), list(df1, df2, df3))
#If there are lot of dataframes use `mget` and `ls`
#Reduce(function(x, y) merge(x, y, by = 'V1'), mget(ls(pattern = "df\\d+")))

#  V1   V2    V3    V4   V5   V6   V7   V8   V9  V10
#1 AB 45.2  4.56  0.21 12.2 31.2  5.1 12.1 12.0 62.6
#2 FG 78.1 54.10 36.10  9.0 32.0 32.6 11.3 31.2 54.1
#3 HG 98.1 25.00 12.60  8.1 23.1 56.1 15.2 21.6 20.2
#4 TR  1.2  3.25 65.10  5.2 41.6 10.2 31.1 32.1 66.1

data

, где один столбец в данных является общим для всех фреймов данных и остальные из них имеют разные имена.

df1 <- structure(list(V1 = structure(1:4, .Label = c("AB", "FG", "HG", 
"TR"), class = "factor"), V2 = c(45.2, 78.1, 98.1, 1.2), V3 = c(4.56, 
54.1, 25, 3.25), V4 = c(0.21, 36.1, 12.6, 65.1)), 
class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(V1 = structure(4:1, .Label = c("AB", "FG", "HG", 
"TR"), class = "factor"), V5 = c(5.2, 8.1, 9, 12.2), V6 = c(41.6, 
23.1, 32, 31.25), V7 = c(10.21, 56.1, 32.6, 5.1)), class = "data.frame", 
row.names = c(NA, -4L))

df3 <- structure(list(V1 = structure(c(3L, 4L, 1L, 2L), .Label = c("AB", 
"FG", "HG", "TR"), class = "factor"), V8 = c(15.2, 31.1, 12.1, 
11.3), V9 = c(21.6, 32.1, 12, 31.25), V10 = c(20.21, 66.1, 62.6, 
54.1)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 08 апреля 2020

Мы можем использовать reduce с inner_join в tidyverseR)

library(dplyr)
library(purrr)
mget(paste0('df', 1:3)) %>%
   reduce(inner_join)

data

df1 <- structure(list(V1 = structure(1:4, .Label = c("AB", "FG", "HG", 
"TR"), class = "factor"), V2 = c(45.2, 78.1, 98.1, 1.2), V3 = c(4.56, 
54.1, 25, 3.25), V4 = c(0.21, 36.1, 12.6, 65.1)), 
class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(V1 = structure(4:1, .Label = c("AB", "FG", "HG", 
"TR"), class = "factor"), V5 = c(5.2, 8.1, 9, 12.2), V6 = c(41.6, 
23.1, 32, 31.25), V7 = c(10.21, 56.1, 32.6, 5.1)), class = "data.frame", 
row.names = c(NA, -4L))

df3 <- structure(list(V1 = structure(c(3L, 4L, 1L, 2L), .Label = c("AB", 
"FG", "HG", "TR"), class = "factor"), V8 = c(15.2, 31.1, 12.1, 
11.3), V9 = c(21.6, 32.1, 12, 31.25), V10 = c(20.21, 66.1, 62.6, 
54.1)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...