R: если значения двух столбцов двух фреймов данных равны, добавить столбец одного из двух фреймов данных - PullRequest
0 голосов
/ 24 января 2020

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

columns df1= a, b, c, d

columns df2= e, f, c, d

Я хочу сказать, что если df1$a == df2$e и одновременно df1$b == df2$f I хочу напечатать в новом столбце df1$x значения соответствующих df2$c.

Итак, я написал эту команду df1$x <- ifelse(df1$a %in% df2$e & df1$b %in% df2$f, df2$c, ifelse (NULL))

Но значения в df1x неверны. Я думаю, что я должен сделать некоторое время l oop, но я не знаю, с чего начать.

Николетта

1 Ответ

1 голос
/ 24 января 2020

Для объединения двух фреймов данных по нескольким столбцам вы можете использовать merge и соответствующие by.x и by.y. Оба из них принимают вектор имен столбцов. Параметр all.x означает, что все данные с первого df1 будут сохранены.

df1 <-  merge(df1, df2[,c("e","f","c")], by.x=c("a","b"), by.y=c("e","f"), all.x=T)

colnames(df1) <- c("a","b","c","d","x")

Для получения дополнительной информации см. ?merge. Для более сложной операции вы можете проверить пакет dplyr и его функцию left_join.

Результат на случайных данных

df1 <- data.frame(a = sample(1:5), b= sample(1:5), c=runif(5), d = runif(5))
df2 <- data.frame(e = df1$a, f = df1$b, c = runif(5), d = runif(5))
df2$e[3] <- 7

Выход

> df1
  a b          c          d
1 5 4 0.76677063 0.92123552
2 4 1 0.93524320 0.09275425
3 3 2 0.01121468 0.12035981
4 1 5 0.72992427 0.87711572
5 2 3 0.11680937 0.93696597
> df2$e[3] <- 7
> df2
  e f         c         d
1 5 4 0.6251662 0.1549575
2 4 1 0.8464672 0.8702837
3 7 2 0.5394273 0.4290171
4 1 5 0.4061817 0.9072905
5 2 3 0.3376456 0.4291463
> merge(df1, df2[,c("e","f","c")], by.x=c("a","b"), by.y=c("e","f"), all.x=T)
  a b          c          d         x
1 1 5 0.72992427 0.87711572 0.4061817
2 2 3 0.11680937 0.93696597 0.3376456
3 3 2 0.01121468 0.12035981        NA
4 4 1 0.93524320 0.09275425 0.8464672
5 5 4 0.76677063 0.92123552 0.6251662
...