#r #hierarchy
#r #иерархия
Вопрос:
Я извлекаю названия разделов и ссылки в этом разделе из большого документа, используя R.
Мои результаты в настоящее время выглядят так:
df<-data.frame("sectname"=c("1","1.1","1.2","1.1.1","1.2","3","2","2.1"), "ref"=c("FALSE","2.1", "3", "FALSE","FALSE","FALSE","FALSE", "FALSE"))
Однако имена разделов, которые не являются последовательными в иерархии [3,6], на самом деле являются ссылками, принадлежащими строке выше.
Есть ли функциональный способ захватить их и вставить в ref[i-1]?
Желаемый результат:
<sectname> <ref>
1 FALSE
1.1 c("2.1","1.2","3")
1.1.1 FALSE
1.2 3
2 FALSE
2.1 FALSE
Комментарии:
1. Каков ожидаемый результат
2. Я не понимаю, что вы пытаетесь сделать. Было бы полезно, если бы вы предоставили желаемый результат, чтобы мы могли протестировать возможные решения, чтобы убедиться, что они дают желаемые результаты.
Ответ №1:
Насколько я понимаю, вы хотите итеративно удалять элементы sectname
, которые нарушают его последовательный порядок, и вставлять их в элементы ref
, которые не являются ложными.
Это можно сделать с while
циклом. Единственная проблема заключается в том, что ref
в конечном итоге получается длиннее, чем sectname
, поскольку вы делаете sectname
короче, но сохраняете длину ref
. Поэтому они не могут оставаться столбцами фрейма данных.
Я подозреваю, что из структуры данных они, естественно, не принадлежат строкам в любом случае. Вот как выполнить преобразование. Мне нужно будет оставить результат в виде векторов, поскольку неясно, к какой структуре данных они должны принадлежать.
extras <- character()
sectname <- df$sectname
ref <- df$ref
while(TRUE)
{
vals <- which(diff(order(sectname)) != 1)
if(length(vals) == 0) break
i <- vals[1] 1
extras <- c(extras, sectname[i])
sectname <- sectname[-i]
}
ref[which(ref != "FALSE")] <- paste(ref[which(ref != "FALSE")], extras)
ref
#> [1] "FALSE" "2.1 1.2" "3 3" "FALSE" "FALSE" "FALSE" "FALSE"
#> [8] "FALSE"
sectname
#> [1] "1" "1.1" "1.1.1" "1.2" "2" "2.1"
Создано 2020-08-25 пакетом reprex (версия 0.3.0)