Предположим, у меня есть этот набор данных для начала, в этом глупом макете:
originalDF <- data.frame(
Index = 1:14,
Field = c("Name", "Weight", "Age", "Name", "Weight", "Age", "Height", "Name", "Weight", "Age", "Height", "Name", "Age", "Height"),
Value = c("Sara", "115", "17", "Bob", "158", "22", "72", "Irv", "210", "42", "68", "Fred", "155", "65")
)
Я хочу, чтобы это выглядело так:
По сути, я хочу сопоставить строки «Вес», «Возраст» и «Рост» со строкой «Имя» над ним. Разделить данные легко, используя dplyr
:
namesDF <- originalDF %>%
filter(Field == "Name")
detailsDF <- originalDF %>%
filter(!Field == "Name")
Отсюда использование индекса (номер строки) кажется наилучшим способом, то есть сопоставьте каждую строку в detailsDF
с записью в namesDF
, которая имеет ближайший индекс без перехода. Я использовал пакет fuzzyjoin
и присоединился к ним с
fuzzy_left_join(detailsDF, namesDF, by = "Index", match_fun = list(`>`))
Этот вид работает, но он также объединяет каждую строку в detailsDF
с КАЖДОЙ строкой в namesDF
с меньшим индексным номером:
Я придумал решение, использующее расстояние до следующего индекса и отфильтровав таким образом лишние строки, но я хочу избежать этого; фактический исходный файл будет содержать более 200 тыс. строк, а временный результирующий кадр данных с дополнительными строками будет слишком большим, чтобы поместиться в память. Я могу здесь что-нибудь сделать? Спасибо!