Сравнение двух столбцов двух разных фреймов данных с разной длиной строк возвращает третью строку - PullRequest
0 голосов
/ 15 марта 2020

У меня есть два разных df, которые имеют одинаковые столбцы: «O» для места и «date» для времени. Df 1 дает разную информацию для определенного места (O) и времени (даты) в одной строке 1, а df 2 содержит много информации для одного и того же года и места во многих разных строках. Нет, я хочу извлечь одно условие первого df, которое применяется ко всем строкам второго df, если значения для «O» и «date» равны.

Чтобы было более понятно: у меня есть одна строка в df 1: krnqm = 250 для O = 1002 и date = 1885. Теперь я хочу новый столбец "krnqm" в df 2, где df2 $ krnqm = 250 для всех строк, где df2 $ 0 = 1002 и df2 $ date = 1885.

К сожалению, я не знаю, как поместить это условие в строку кода, и был бы признателен за вашу помощь.

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете сделать это довольно легко в базе R, используя функцию слияния. Вот пример.

Имитируйте некоторые данные из вашего описания:

df1 <- expand.grid(O = letters[c(2:4,7)], date = c(1,3))
df2 <- data.frame(O = rep(letters[1:6], c(2,3,3,6,2,2)), date = rep(1:3, c(3,2,4)))
df1$krnqm <- sample(1:1000, size = nrow(df1), replace=T)

> df1
  O date krnqm
1 b    1   833
2 c    1   219
3 d    1   773
4 g    1   514
5 b    3   118
6 c    3   969
7 d    3   704
8 g    3   914
> df2
   O date
1  a    1
2  a    1
3  b    1
4  b    2
5  b    2
6  c    3
7  c    3
8  c    3
9  d    3
10 d    1
11 d    1
12 d    1
13 d    2
14 d    2
15 e    3
16 e    3
17 f    3
18 f    3

Теперь давайте объединим два фрейма данных описанным вами способом.

df2 <- merge(df2, df1, all.x=T)
> df2
   O date krnqm
1  a    1    NA
2  a    1    NA
3  b    1   833
4  b    2    NA
5  b    2    NA
6  c    3   969
7  c    3   969
8  c    3   969
9  d    1   773
10 d    1   773
11 d    1   773
12 d    2    NA
13 d    2    NA
14 d    3   704
15 e    3    NA
16 e    3    NA
17 f    3    NA
18 f    3    NA

Итак, вы Можно видеть, что столбец krnqm в результирующем фрейме данных содержит NA для любых комбинаций «O» и «date», которые не были найдены в фрейме данных, из которого были извлечены значения krnqm. Если в вашем df1 есть другие столбцы, которые вы не хотите включать в объединение, просто слегка измените вызов объединения, чтобы использовать только те столбцы, которые вам нужны: df2 <- merge(df2, df1[,c("O", "date", "krnqm")], all.x=T).

Удачи!

...