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