Цикл для возврата числа из строки с заданными условиями R

#r #loops #for-loop #if-statement

#r #циклы #для цикла #if-оператор

Вопрос:

У меня есть вопрос. Например, у меня есть столбец, указывающий район в виде строки "district1" . Однако теперь я хотел бы добавить еще один столбец только с номером района. Я использую операторы if else, но это утомительно.

Ниже я привожу только пример из более чем 30 районов, которые у меня есть:

 ### generate dataframe
 d <- data.frame(variable=c("district1", "district1", "district1", "district1", "district2", "district2", "district3"))


 d$id1 = ifelse(d$variable=="district1", 1,
                        ifelse(d$variable=="district2", 2,
                               ifelse(d$variable=="district3", 3, NA)))
  

Таким образом, мне было интересно, возможно ли это сделать с помощью цикла. Однако структура цикла выполнена не очень хорошо:

 #  for (i in 1:30){
#    d$id1 = ifelse(d$variable=="districti", i, NA) 
# }
  

Может ли кто-нибудь помочь мне сделать это более элегантным способом? Это было бы здорово
Лучшие

Комментарии:

1. Попробуйте регулярное выражение , gsub("[^[:digit:]]", "", d$variable) . Замените ( gsub ) все совпадения пустой строкой "" . Циклов вообще нет.

2. Кроме того, d$variable=="districti" правильным способом было бы d$variable==paste0("district", i) . Или sprintf("district%d", i) вместо paste0 .Но цикл все равно был бы неправильным, вы бы создали столбец со всеми, NA за исключением позиций совпадения, и переписывали предыдущие совпадения на каждой следующей итерации с другим i . Попробуйте, чтобы увидеть, что не так.

3. Большое вам спасибо. Команда gsub здесь работает очень хорошо.

Ответ №1:

возможно, вы ищете решение, подобное этому:

 library(tydiverse)
d %>% 
  group_by(variable) %>% 
  mutate(id = cur_group_id())

d %>% 
  mutate(id = str_remove_all(variable, pattern = "[a-zA-Z]"))

   variable id
1 district1  1
2 district1  1
3 district1  1
4 district1  1
5 district2  2
6 district2  2
7 district3  3
  

Ответ №2:

Вы можете попробовать этот подход

 library(dplyr)
library(stringr)
d %>% 
 mutate(num = str_extract(variable, "\d "))
#   variable num
# 1 district1   1
# 2 district1   1
# 3 district1   1
# 4 district1   1
# 5 district2   2
# 6 district2   2
# 7 district3   3
  

Используйте str_extract для извлечения номера; \d соответствует цифрам по крайней мере один раз