Как я могу отфильтровать непоследовательные идентификаторы из данных, организованных в иерархии в R?

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