Значение поиска на основе нескольких столбцов во фрейме данных - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь выяснить, как искать значение, используя несколько столбцов.Просто не могу заставить его работать правильно.Вот пример:

df1 <- data.frame(g1 = c("a", "b", "c", "c"), g2 = c(1, 2, 3, 4))
df2 <- data.frame(g.1 = c("a", "b", "c"), g.2 = c(1, 2, 4), val = c(100, 200, 300))

Итак, я попытался сделать:

df1$value <- df2[match(df1$g1, df2$g.1) & match(df1$g2, df2$g.2),]$val

Но это не работает для последнего значения, и я предполагаю, что это работает только для первых 2 простопо ошибкеЯ бы хотел, чтобы df1 выглядел так:

  g1 g2 value
1  a  1   100
2  b  2   200
3  c  3    NA
4  c  4   300

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Объединение будет лучше, и с data.table оно станет более эффективным, так как мы обновляем мою ссылку

library(data.table)
setDT(df1)[df2, value := val, on = .(g1 = g.1, g2 = g.2)]
df1
#    g1 g2 value
#1:  a  1   100
#2:  b  2   200
#3:  c  3    NA
#4:  c  4   300

С match, один подход будет paste столбцыинтерес вместе, а затем создать единый индекс для изменения значений

p1 <- do.call(paste, df1)
p2 <- do.call(paste, df2[1:2])
i1 <- match(p1, p2, nomatch = 0)
i2 <- match(p2, p1, nomatch = 0)
df1$value[i2] <- df2$val[i1]
df1
#  g1 g2 value
#1  a  1   100
#2  b  2   200
#3  c  3    NA
#4  c  4   300
0 голосов
/ 08 февраля 2019

Я понял, что я делаю неправильно, основываясь на @G.Гротендик ответ.Все, что мне нужно было сделать, это:

df1$value <- df2[match(paste0(df1$g1,df1$g2), paste0(df2$g.1,df2$g.2)),]$val
0 голосов
/ 08 февраля 2019

Попробуйте левое соединение, используя merge:

merge(df1, df2, by = 1:2, all.x = TRUE)

, давая:

  g1 g2 val
1  a  1 100
2  b  2 200
3  c  3  NA
4  c  4 300

Некоторые альтернативы:

transform(df1, val = df2$val[match(paste(g1, g2), paste(df2$g.1, df2$g.2))])

library(sqldf)
sqldf("select df1.*, df2.val 
       from df1 left join df2 on g1 = [g.1] and g2 = [g.2]")

library(dplyr)
df1 %>% left_join(df2, by = c(g1 = "g.1", g2 = "g.2"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...