Как эффективно обрабатывать данные для автоматизации процесса Excel? - PullRequest
0 голосов
/ 20 сентября 2019

Существует так много макросов, которые мы делаем через Excel, но можем ли мы автоматизировать с помощью R? .

Не уверен, что нужно, поскольку я еще не эксперт по R.Такие функции, как сборка, распространение или изменение формы, не имеют особого смысла ... возможно, stringr и regrex могут сыграть свою роль, но недостаточно опытны, чтобы попробовать.

По сути,

  1. Мы должны удалить идентификаторы, такие как beet_root, apple, из столбца «список» (обычно начинаются с алфавита, за исключением нескольких известных исключений, таких как ot_p).Конечно, мы могли бы также полностью удалить эту строку.
  2. Создать новые имена столбцов и затем добавить соответствующие идентификаторы, например, для оранжевого идентификатора для значения списка: 9734,75R4, а не 123 / R90который соответствует ID винограда

Пожалуйста, найдите представьте (упрощенный процесс Excel)

library(tidyverse)



> input
        list other_col1 other_col2
1  beet_root          a          u
2    123/92R          b          b
3    123/92R          c          q
4    10.1233          d          p
5      9.485          e          e
6       ot_p          f          f
7      apple          g          b
8    12X0893          z          z
9      123fg          h          8
10     038q4          i          i
11    orange          j          j
12      9734          k          9
13      75R4          l          l
14    grapes          m          m
15   123/R90          n          5
16   90X83.6          o          o


> expected_output
      list other_col1 other_col2     names
1  123/92R          b          b beet_root
2  123/92R          c          q beet_root
3  10.1233          d          p beet_root
4    9.485          e          e beet_root
5     ot_p          f          f beet_root
6  12X0893          z          z     apple
7    123fg          h          8     apple
8    038q4          i          i     apple
9     9734          k          9    orange
10    75R4          l          l    orange
11 123/R90          n          5    grapes
12 90X83.6          o          o    grapes


Данные:

# Actual data 
input = data.frame("list" = c("beet_root","123/92R","123/92R","10.1233","9.485","ot_p",
                            "apple","12X0893","123fg","038q4",
                            "orange","9734","75R4",
                           "grapes", "123/R90","90X83.6"),
                "other_col1" = c("a","b","c","d","e","f","g","z",
                                "h","i","j","k","l","m","n","o"),
                "other_col2" = c("u","b","q","p","e","f","b","z",
                                "8","i","j","9","l","m","5","o"))
expected_output = data.frame("list" = c("123/92R","123/92R","10.1233","9.485","ot_p",
                                      "12X0893","123fg","038q4",
                                      "9734","75R4",
                                      "123/R90","90X83.6"),
                           "other_col1" = c("b","c","d","e",
                                            "f","z","h","i",
                                            "k","l",
                                            "n","o"
                                            ),
                           "other_col2" = c("b","q","p","e",
                                            "f","z","8","i",
                                            "9","l",
                                            "5","o"),
                           "names" = c("beet_root","beet_root","beet_root","beet_root","beet_root",
                                       "apple","apple","apple",
                                       "orange","orange",
                                       "grapes","grapes"))

Ответы [ 2 ]

4 голосов
/ 20 сентября 2019

Мы создаем новый столбец names, который имеет значение от list, если он следует определенному шаблону (начинается с числа или равен "ot_p") или имеет NA.Мы fill NA значения names вниз и затем используем то же регулярное выражение для filter строк.

library(dplyr)

input %>%
  mutate(names = ifelse(!grepl("^[0-9]|ot_p", list), list, NA)) %>% 
  tidyr::fill(names) %>%
  filter(grepl("^[0-9]|ot_p", list))

#      list other_col1 other_col2     names
#1  123/92R          b          b beet_root
#2  123/92R          c          q beet_root
#3  10.1233          d          p beet_root
#4    9.485          e          e beet_root
#5     ot_p          f          f beet_root
#6  12X0893          z          z     apple
#7    123fg          h          8     apple
#8    038q4          i          i     apple
#9     9734          k          9    orange
#10    75R4          l          l    orange
#11 123/R90          n          5    grapes
#12 90X83.6          o          o    grapes

Ran input[] <- lapply(input, as.character), чтобы сначала преобразовать factors в символы.

1 голос
/ 20 сентября 2019

Опция с tidyverse

library(tidyverse0
input %>% 
  mutate(names =  case_when(str_detect(list, "^([0-9]|ot_p)") ~ 
            NA_character_, TRUE ~ as.character(list) )) %>%
  fill(names) %>%
  filter(str_detect(list, "^[0-9]|ot_p"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...