Свернуть строки в наименьшую полную строку в каждом наборе - PullRequest
0 голосов
/ 06 марта 2019

Я очищаю гигантский набор данных, полученный от использования tabulizer() в PDF.

Столбцы правильно очерчены, но у меня есть много строк, где одна ячейка в оригинале была гигантской, и tabulizer читал ее как несколько строк, причем все ячейки оставались пустыми, кроме большой.Мне нужно свернуть фрейм данных так, чтобы строки сворачивались «вниз» до самой нижней полной строки.

Вот пример того, как выглядят данные: enter image description here

Как видите, столбец, в котором появляются эти "дополнительные строки", зависит от строки(в одном случае это species, в других случаях это area.of.operation. Я хочу свернуть их, чтобы завершить строки, чтобы строка 1 осталась неповрежденной, строка 2 фактически была строкой 2: 6 свернута, строка 7 не повреждена и т. д.Я даже не знаю, является ли R лучшим инструментом для этого, но мне бы очень хотелось, если бы было решение * 1014. * Пример кадра данных ниже.

Заранее спасибо.

  mydata <-  structure(list(X = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 11L, 12L, 13L, 
17L), target.species = structure(c(4L, 1L, 1L, 1L, 1L, 5L, 4L, 
1L, 1L, 2L, 3L), .Label = c("", "hake", "hake, southern", "rosefish", 
"squid, cuttlefish,"), class = "factor"), gear = structure(c(2L, 
1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 3L, 2L), .Label = c("", "trawl, bottom", 
"trawl, midwater"), class = "factor"), number.boats = structure(c(2L, 
1L, 1L, 1L, 1L, 3L, 5L, 1L, 1L, 4L, 4L), .Label = c("", "18 vessels", 
"98 refrigerated high", "none provided", "seas vessels"), class = "factor"), 
    company = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
    2L, 2L), .Label = c("", "not applicable"), class = "factor"), 
    area.of.operation = structure(c(2L, 1L, 1L, 1L, 3L, 4L, 2L, 
    3L, 4L, 2L, 5L), .Label = c("", "above provinces", "annual fishery; EEZ", 
    "concentrated around", "deepwater coastal"), class = "factor"), 
    species = structure(c(6L, 3L, 4L, 5L, 9L, 8L, 7L, 9L, 8L, 
    1L, 2L), .Label = c("Fur seal", "none provided", "otter", 
    "otter, river", "porpoise", "seal", "Seal", "South American Sea lion,", 
    "spectacled porpoise,"), class = "factor"), estimates = structure(c(2L, 
    1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L), .Label = c("", "none"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
-11L))

1 Ответ

0 голосов
/ 07 марта 2019

Старая стратегия cumsum - split с оклейкой каждого столбца с помощью collapse = ",", а затем sub без лишних запятых дает вам большую часть пути:

t( as.data.frame(    # transpose because of the column oriented nature of R's apply returns
   lapply( split(mydata, cumsum( mydata$target.species != "")), 
       function(d){ sub(",.*,", ",", lapply( d, paste,  collapse=","))})))
   [,1]   [,2]             [,3]              [,4]                   [,5]              [,6]                                 
X1 "1,5"  "rosefish,"      "trawl,"          "18 vessels,"          "not applicable," "above provinces,annual fishery; EEZ"
X2 "6"    "squid,"         ""                "98 refrigerated high" ""                "concentrated around"                
X3 "7,12" "rosefish,"      "trawl,"          "seas vessels,"        "not applicable," "above provinces,concentrated around"
X4 "13"   "hake"           "trawl, midwater" "none provided"        "not applicable"  "above provinces"                    
X5 "17"   "hake, southern" "trawl, bottom"   "none provided"        "not applicable"  "deepwater coastal"                  
   [,7]                       [,8]   
X1 "seal,"                    "none,"
X2 "South American Sea lion," ""     
X3 "Seal,"                    "none,"
X4 "Fur seal"                 "none" 
X5 "none provided"            "none" 
...