как разделить столбец на несколько столбцов и изменить результаты с символов на цифры - PullRequest
0 голосов
/ 28 июня 2018

enter image description here

## id ## ## инициатива ##

1 abc 2a 2 кд 2б 3 эф 4 гэ ц 5 JYTD 5V 6 jydjytd e

Здравствуйте, у меня есть нечто похожее на это, только намного больше, и мне было интересно, какой самый эффективный способ разделить столбец инициативный на две колонки, одна из которых содержит числа (2,2,5,4), а другая содержащий буквы или пробел. это должна быть общая формула, поскольку фрейм данных, который мне нужно применить, тоже довольно большой Буквы соответствуют конкретному номеру инициативы, но первый номер инициативы не указан, а «a» соответствует инициативе № 2.

Мне бы хотелось, чтобы это выглядело примерно так, буквы были бы заменены числами (пробел = 1, a = 2, b = 3 и т. Д.)

id    initiativen question
abc        2         2
cde        3         2
efd        2         N/A
geh        4         N/A
jytd       23        5
jydjytd    6         N/A
bfdhslbf   1         3

Я пытался использовать «отдельный», но он не работает и не решает проблему первой инициативы, не имеющей соответствующей буквы. Любая помощь или предложение будут чрезвычайно приветствоваться и полезны.

Большое спасибо:)

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Использование data.table

# Step one
    setDT(df)
df[, ":="(
      question  = gsub("[a-z]", "", initiativen),
      initiativen = match(gsub("[0-9]", "", initiativen), letters, nomatch = 0) + 1L
    )
   ]
df
        id initiativen question
1:     abc           2        2
2:     cde           3        2
3:     efd           2         
4:     geh           4         
5:    jytd          23        5
6: jydjytd           6         
7: vbdjfkb           1        4

# Then some tidying
df[, question := ifelse(nzchar(question), question, NA)]

df
        id initiativen question
1:     abc           2        2
2:     cde           3        2
3:     efd           2     <NA>
4:     geh           4     <NA>
5:    jytd          23        5
6: jydjytd           6     <NA>
7: vbdjfkb           1        4

Данные

df <- data.frame(
  id = c("abc", "cde", "efd", "geh", "jytd", "jydjytd", "vbdjfkb"),
  initiativen = c("2a", "2b", "a", "c", "5v", "e", "4"),
  stringsAsFactors = FALSE
)

Редактировать

Можно также сделать за один шаг:

df[, question := gsub("[a-z]", "", initiativen)
   ][, ":="(
      question = ifelse(nzchar(question), question, NA),
      initiativen = match(gsub("[0-9]", "", initiativen), letters, nomatch = 0) + 1L
    )
   ]
0 голосов
/ 28 июня 2018

Для второго столбца вы можете использовать регулярное выражение, чтобы сохранить только числовые значения:

df$initiativen <- gsub("[^0-9]", "", df$initiativen)
0 голосов
/ 28 июня 2018

Как насчет следующего tidyverse решения?

library(tidyverse);
df %>%
    separate(initiativen, into = c("p1", "p2"), sep = "(?<=[0-9])(?=[a-z])") %>%
    mutate(
        initiativen = case_when(
            str_detect(p1, "[a-z]") ~ p1,
            str_detect(p2, "[a-z]") ~ p2),
        question = case_when(
            str_detect(p1, "[0-9]") ~ p1,
            str_detect(p2, "[0-9]") ~ p2)) %>%
    mutate(initiativen = ifelse(is.na(initiativen), 1, match(initiativen, letters) + 1)) %>%
    select(-p1, -p2)
#       id initiativen question
#1     abc           2        2
#2     cde           3        2
#3     efd           2     <NA>
#4     geh           4     <NA>
#5    jytd          23        5
#6 jydjytd           6     <NA>
#7 vbdjfkb           1        4

Обратите внимание, что предупреждение можно безопасно игнорировать, так как оно возникает из-за пропущенных полей при separate ing.

Пояснение: Мы используем положительный прогноз и прогноз, чтобы разделить записи в initiativen на две части p1 и p2; затем мы заполняем initiativen и question записями от p1 или p2 в зависимости от того, содержат ли они число "[0-9]" или символ "[a-z]"; преобразовать символы в числа с помощью match(initiativen, letters) и, наконец, очистить data.frame.


Пример данных

df <- read.table(text =
    "       id initiativen
1     abc          2a
2     cde          2b
3     efd           a
4     geh           c
5    jytd          5v
6 jydjytd           e
7 vbdjfkb          4", row.names = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...