Как заполнить столбец, используя несколько условных выражений на двух фреймах данных? - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь заполнить столбец значениями на основе двух условий в двух отдельных фреймах данных. Итак,

df1 $ day == df2 $ day & df1 $ hour == df2 $ hour, затем заполните df1 $ X глубиной df2 $

Я борюсь, потому что я не прошу его заполнить это со значением generi c (т. е. если x == y, то y2 = 1). Я пытаюсь получить его выбрать значения в нескольких строках. Ложный пример:

df1                         df2
day   hour   X              day  hour   depth 
1      10    NA             1    10     50
1      11    NA             1    11     10
2      5     NA             1    3      100
5      9     NA             5    9      50
6      20    NA             7    17     80
7      17    NA             10    4     65

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Более простым вариантом является соединение из data.table

library(data.table)
setDT(df1)[df2, X := depth, on = .(day, hour)]
df1
#   day hour  X
#1:   1   10 50
#2:   1   11 10
#3:   2    5 NA
#4:   5    9 50
#5:   6   20 NA
#6:   7   17 80

В base R, мы можем использовать match

df1$X <- with(df1, df2$depth[match(paste(day, hour), paste(df2$day, df2$hour))])

data

df1<- data.frame(day = c(1, 1, 2, 5:7), hour = c(10:11, 5, 9, 20, 17),
         X = NA_integer_)
df2 <- data.frame(day = c(1, 1, 1, 5, 7, 10), hour = c(10, 11, 3, 9, 
       17, 4), depth = c(50, 10, 100, 50, 80, 65))
0 голосов
/ 11 февраля 2020

Используя dplyr, мы можем сделать left_join и затем rename столбец depth как X

library(dplyr)
left_join(df1, df2, by = c("day", "hour")) %>%
   select(-X) %>%
   rename(X = depth)

#  day hour  X
#1   1   10 50
#2   1   11 10
#3   2    5 NA
#4   5    9 50
#5   6   20 NA
#6   7   17 80

Если столбец X не всегда NA Вы можете использовать coalesce.

left_join(df1, df2, by = c("day", "hour")) %>%
   mutate(X = coalesce(depth, X)) %>%
   select(names(df1))

Или в базе R:

merge(df1, df2, all.x = TRUE)[-3]
...