Недавно я пытался произвести определенный вывод, используя 2 кадра данных, но, похоже, моего опыта работы с R по-прежнему недостаточно для этого. Я провел много часов, но не могу найти ответ, как это сделать. Любая помощь по следующему заданию приветствуется.
У меня есть два набора данных base_df
и compare_df
. Определенные элементы (ячейки) из compare_df
должны быть вставлены в base_df
с использованием следующих правил:
a) элемент из id
столбца из base_df
и элемент из id
из compare_df
должны быть равны
b) если число от xx, yy или zz, после того, как символ отделен, используя разделитель _
для ex. «1.5_2.5» можно сохранить в 2 отдельных переменных, таких как val1
= 1,5 и val2
= 2,5, поэтому:
если (compare_df$val1 > base_df$var1 & compare_df$val1 < lead(base_df$var1)) & (compare_df$val2 > base_df$var2 & compare_df$val2 < lead(base_df$var2))
, то вставьте значения val1
и val2
из compare_df
между строками 1 и 2 в base_df
.
в) использовать имя переменной, для которой был выполнен обмен, в данном случае для ex. создайте новую переменную, скажем, ind
, и присвойте значение этой переменной для вновь созданной строки 2 в base_df
, равное "xx".
Примечание: compare_df
имеет много столбцов, таких как xx,yy and zz
, для которых также необходимо выполнить процесс. Таким образом, условие проверяется для всех столбцов в compare_df
, кроме идентификатора.
В основном, каждая информация строки из compare_df
должна сравниваться со всеми строками в base_df
и проверять, выполняются ли условия. Там может быть несколько совпадений. Исходный порядок строк должен быть сохранен, поэтому arrange
нельзя использовать, так как var1
и var2
не увеличиваются с номером строки. Может быть, это можно сделать с помощью функций apply
?
Ниже приведены упрощенные примеры:
base_df <- data.frame(id = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b"),
var1 = c(1,3,5,-7,-9,11,13,15,17,19),
var2 = c(2,4,6,8,-10,12,14,16,18,20))
compare_df <- data.frame(id = c("a", "b"),
xx = c("1.5_2.5", "17.5_18.5"),
yy = c("3.5_2.5", "12.5_18.5"),
zz = c("3.5_4.5", "15.5_16.5"))
# desired
final_df <- data.frame(
id = c("a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b"),
ind = c("org", "xx", "org", "zz", "org", "org", "org", "org", "org", "org", "zz", "org", "xx", "org"),
var1 = c(1, 1.5, 3, 3.5, 5, -7, -9, 11, 13, 15, 15.5, 17, 17.5, 19),
var2 = c(2, 2.5, 4, 4.5, 6, 8, -10, 12, 14, 16, 16.5, 18, 18.5, 20))