#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
соответствует цифрам по крайней мере один раз