R: заменить столбец в зависимости от совпадения двух других столбцов - PullRequest
0 голосов
/ 16 марта 2019

Предположим, что есть два столбца двух огромных фреймов данных (различной длины), например:

 df1       df2
A  1      C  X
A  1      D  X
B  4      C  X
A  1      F  X
B  4      A  X
B  4      B  X
C  7      B  X

Каждый раз, когда в 1-м столбце есть совпадение, X следует заменить данными из столбца 2 из df1,Если 1-й столбец df2 содержит элементы, которые все еще не находятся в первом столбце df1 (F, D), X следует заменить на 0.

Следовательно, существует огромный фрейм данных, цикл в циклебесполезно.

Решение должно выглядеть так:

 df1       df2
A  1      C  7
A  1      D  0
B  4      C  7
A  1      F  0
B  4      A  1
B  4      B  4
C  7      B  4

Заранее спасибо

1 Ответ

0 голосов
/ 16 марта 2019

Поскольку в 'df1' есть повторяющиеся строки, мы можем получить unique строки

df3 <- unique(df1)

Затем, используя match, получить idnex

i1 <- match(df2$Col1, df3$Col1)

ина основе индекса присвойте

df2$Col2 <- df3$Col2[i1]

Если совпадений нет, это будет NA, который можно изменить на 0

df2$Col2[is.na(df2$Col2)] <- 0
df2
#  Col1 Col2
#1    C    7
#2    D    0
#3    C    7
#4    F    0
#5    A    1
#6    B    4
#7    B    4

Или это может бытьсделано с помощью data.table путем join ввода в 'Col1' и присвоении 'Col2' (после удаления Col2 из вторых данных) с Col2 из 'df3'

library(data.table)
setDT(df2)[, Col2 := NULL][df3, Col2 := Col2, on = .(Col1)]

data

df1 <- structure(list(Col1 = c("A", "A", "B", "A", "B", "B", "C"), Col2 = c(1, 
1, 4, 1, 4, 4, 7)), class = "data.frame", row.names = c(NA, -7L
))

df2 <- structure(list(Col1 = c("C", "D", "C", "F", "A", "B", "B"), Col2 = c("X", 
"X", "X", "X", "X", "X", "X")), class = "data.frame", row.names = c(NA, 
-7L))
...