Объединить два столбца в 2 кадра данных в зависимости от сопоставления - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два кадра данных

Df1

Col1 Name Col3
ALL1 10 OP
ALL2 20 IO
ALL2 20 YU
ALL2 20 RT
ALL3 20 YU
ALL3 90 YU
ALL4 98 IU

DF2

   Col1bis Col2
    ALL1 OKI
    ALL2 OP
    ALL3 I
    ALL4 LOP

Ожидаемый результат: DF2

  Col1bis Col2 Name
    ALL1 OKI 10
    ALL2 OP 20
    ALL3 I 90
    ALL4 LOP 98 

и I хотел бы добавить столбец Name к df2, который соответствует тому же шаблону в Col1 и Col1bis

Ответы [ 2 ]

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

Что вам нужно сделать, это объединить или «объединить» ваши наборы данных, вот три наиболее распространенных подхода: l. Сначала вот данные, с которыми я проверяю это.

# Dummy data
df1 <- data.frame(
  V1 = letters[1:10], 
  V2 = rnorm(10, 0, 1))
df2 <- data.frame(
  V1 = letters[c(1,4,6)],
  V3 = rnorm(3, 0, 1))

Первый подход - это база R с использованием функции merge(), которая задает два фрейма данных и переменную, с помощью которой она должна объединять данные.

# Base R
merge(df1, df2, by = "V1")

Далее используются пакеты tidyverse и канал, %>%, сначала выберите df1, а затем - функцию right_join(), одну из множества различных функций объединения в этих пакетах.

# Tidyverse
library(tidyverse)
df1 %>% right_join(df2, by = "V1")

Последний вариант - тот, который я бы использовал, из пакета data.table. Присоединяемая переменная (и) здесь задается как on = ....

# Data.table
library(data.table)
# - convert to data.tables
setDT(df1)
setDT(df2)
# - join
df1[df2, on = "V1"]

Обратите внимание, что если вы строили / считывали свои данные как таблицу данных (используя data.table() и fread() соответственно), вы может пропустить шаг преобразования.

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

Мы можем использовать соединение

library(data.table)
setDT(DF2)[DF1, Name := Name, on = .(Col1bis = Col1)]
DF2
#   Col1bis Col2 Name
#1:    ALL1  OKI   10
#2:    ALL2   OP   20
#3:    ALL3    I   90
#4:    ALL4  LOP   98

Или в base R с match

DF2$Name <- DF1$Name[match(DF2$Col1bis, DF1$Col1)]

data

DF1 <- structure(list(Col1 = c("ALL1", "ALL2", "ALL2", "ALL2", "ALL3", 
"ALL3", "ALL4"), Name = c(10L, 20L, 20L, 20L, 20L, 90L, 98L), 
    Col3 = c("OP", "IO", "YU", "RT", "YU", "YU", "IU")), class = "data.frame", row.names = c(NA, 
-7L))

DF2 <- structure(list(Col1bis = c("ALL1", "ALL2", "ALL3", "ALL4"), Col2 = c("OKI", 
"OP", "I", "LOP")), class = "data.frame", row.names = c(NA, -4L
))
...