Как удалить ссылки на сноски из столбца в R? - PullRequest
0 голосов
/ 21 февраля 2020

вероятно, довольно простой вопрос c. Я пытаюсь проанализировать набор данных, который включает столбец со ссылками на сноски в квадратных скобках. Я надеюсь удалить их, но я не могу найти подходящую функцию / шаблон для удаления их и чисел в скобках.

Аналогично, я хотел бы взять медиана этих записей которые имеют два числа, например "5930 - 6970 [13]", а затем делят все записи на 1000.

              "1800[10]"         "3300 – 12 000[11]"       "5000 – 6000[12]"      
       "5930 – 6970[13]"       "75 000 – 80 000[14]"            "93 000[15]"           
 "195 000 – 210 000[16]"               "530 000[17]"           "595 000[18]"      

Любая помощь будет высоко оценена.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Я интерпретировал запрос немного иначе, чем @akrun. Думая, что тире разделены числами, чей разделитель тысяч был пробелом, я удалил и пробелы, и конечные числа в скобках, используя gsub вместо sub. Тогда процедуре sapply будет дано не более двух чисел в более сопоставимых диапазонах:

df1 <- data.frame(col1 = scan(text=' "1800[10]"         "3300 – 12 000[11]"       "5000 – 6000[12]"      
       "5930 – 6970[13]"       "75 000 – 80 000[14]"            "93 000[15]"           
 "195 000 – 210 000[16]"               "530 000[17]"           "595 000[18]" ', what=""))

Обработка:

sapply( 
     sapply( strsplit(gsub("[ ]|\\[.*$", "", df1$col1), "–"), # remove spc's and [n]
               as.numeric), 
       median)/1000
[1]   1.80   7.65   5.50   6.45  77.50  93.00 202.50 530.00 595.00
2 голосов
/ 21 февраля 2020

Мы могли бы удалить подстроку, начинающуюся с [, используя sub, затем разделить перемешивание либо на пробел, либо на пробел, за которым следует - и любой пробел, на list из vectors, преобразовать его в numeric, получите median и разделите на 1000

sapply(strsplit(sub("\\[.*$", "", df1$col1), "\\s*–\\s*|\\s+"), 
         function(x) median(as.numeric(x)))/1000

data

df1 <- structure(list(col1 = c("1800[10]", "3300 – 12 000[11]", "5000 – 6000[12]", 
"5930 – 6970[13]", "75 000 – 80 000[14]", "93 000[15]", "195 000 – 210 000[16]", 
"530 000[17]", "595 000[18]")), class = "data.frame", row.names = c(NA, 
-9L))
0 голосов
/ 21 февраля 2020

A dplyr / tidyverse решение: Подобно ответам akrun и 42-, я использую gsub(), чтобы избавиться от скобок, их содержимого и пробелов. Далее я tidyr::separate() значения в столбце col1 в два столбца. dplyr::rowise() и dplyr::mutate() затем используются для вычисления медианы на строку и деления на 1000.

library(dplyr)
library(tidyr)

df1 %>% 
  mutate(col1 = gsub("\\[(.*?)\\]|\\s+", "", col1)) %>% 
  separate(col1, into = c("col1", "col2"), sep = "–", fill = "right") %>% 
  mutate_at(vars(col1, col2), as.numeric) %>% 
  rowwise() %>% 
  mutate(result = median(c(col1, col2) / 1000, na.rm = TRUE))
#> Source: local data frame [9 x 3]
#> Groups: <by row>
#> 
#> # A tibble: 9 x 3
#>     col1   col2 result
#>    <dbl>  <dbl>  <dbl>
#> 1   1800     NA   1.8 
#> 2   3300  12000   7.65
#> 3   5000   6000   5.5 
#> 4   5930   6970   6.45
#> 5  75000  80000  77.5 
#> 6  93000     NA  93   
#> 7 195000 210000 202.  
#> 8 530000     NA 530   
#> 9 595000     NA 595

В качестве альтернативы все можно сделать с помощью одного mutate().

library(purrr)

  df1 %>% 
    rowwise() %>%
    mutate(col1 = gsub("\\[(.*?)\\]|\\s+", "", col1) %>% 
             strsplit("–") %>% 
             map_dbl(function(x) as.numeric(x) %>% 
                       median())/1000)
  #> Source: local data frame [9 x 1]
  #> Groups: <by row>
  #> 
  #> # A tibble: 9 x 1
  #>     col1
  #>    <dbl>
  #> 1   1.8 
  #> 2   7.65
  #> 3   5.5 
  #> 4   6.45
  #> 5  77.5 
  #> 6  93   
  #> 7 202.  
  #> 8 530   
  #> 9 595

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

...