R: Заменить столбец в зависимости от соответствия двух других столбцов

#r #dataframe #dependencies #multiple-columns

#r #dataframe #зависимости #несколько столбцов

Вопрос:

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

  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:

Поскольку в ‘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)]
  

данные

 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))