У меня есть два фрейма данных: один, в котором я хотел бы заменить значения (df_1), другой, из которого я хотел бы получить значения для замены (df_2). Пожалуйста, рассмотрите пример данных ниже:
df_1 <- data.frame(
var=c("xAp", "xBp", "sCp", "sABp", "dBCp", "dCBp"),
A=NA,
B=NA,
C=NA)
df_2 <- data.frame(A=1, B=40, C=25)
Если в df_1 имя столбца встречается в первом столбце, то я хочу заменить значение в этом столбце и строке значением из df_2, значением, которое соответствует этому имени столбца. Итак, представьте ячейку df_1[1,2]. Имя столбца — A. Значение A встречается в первом столбце (в df_1[1,1]). Это означает, что я хочу заменить значение NA значением, принадлежащим A в df_2, которое равно 1.
Если имя столбца не встречается в первом столбце, я хочу заменить его нулем.
Поскольку я хочу выполнить это действие для каждой строки, я подумал о мутации в сочетании с cross. Однако я уже застрял, пытаясь извлечь имена столбцов и сравнить их со значениями в первом столбце.
data.frame(
var=c("xAp", "xBp", "sCp", "sABp", "dBCp", "dCBp"),
A=c(1, 0, 0, 1, 0, 0),
B=c(0, 40, 0, 40, 40, 40),
C=c(0, 0, 25, 0, 25, 25))
Было бы здорово, если бы кто-то мог помочь. Спасибо!
Вот один из вариантов — зациклить across
имена столбцов «df_2», создать условие, существует ли подстрока столбца «var» в (cur_column()
), затем вернуть значение «df_2» для этого соответствующего столбца или вернуть 0 в case_when
library(dplyr)
library(stringr)
out2 <- df_1 %>%
mutate(across(all_of(names(df_2)),
~ case_when(str_detect(var, cur_column()) ~ df_2[[cur_column()]], TRUE ~ 0)))
-проверка с ожидаемым ОП
identical(out, out2)
[1] TRUE
Спасибо, там действительно должно быть 40 для B и 25 для C. Я поправил.