Совпадение одного слова в множителе R - PullRequest
0 голосов
/ 04 июня 2018

У меня есть фрейм данных (df) с информацией о домах.Одной из переменных является необработанный адрес для каждого дома.Фрейм данных выглядит примерно так:

City        address         beds  .. price
San Diego   4 Main street    4        400000
San Diego   12 Castle Villas 3        250000
...

Некоторые адреса (которые я закодировал как переменную фактора, но можно изменить) содержат слово «виллы» (или «виллы»).Я хочу идентифицировать все адреса домов, которые содержат слово «виллы», и назначить их для чего-то, и назначить все другие свойства для чего-то еще.Это для использования в дереве решений для оценки стоимости дома.

В настоящее время я пытаюсь что-то вроде:

df$rawAddress <- factor(df$rawAddress, levels=c(levels(df$rawAddress), "Other"))
    villas <- list("villas", "Villas")
    df$rawAddress[! df$rawAddress %in% villas] <- "Other"

Но это проверка того, равен ли весь адрес "villas", поэтому ложно для всех записей.

Ответы [ 3 ]

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

Возможно, вы хотите этого?

set.seed(465)
df <- data.frame(
  city=rep(sample(LETTERS[1:10], 5), 2),
  address=rep(sample(c("castle villas", "VIP Villas", "something", "nothing"),
                     5, replace=TRUE), 2),
  beds=sample(1:8, 10, replace=TRUE),
  price=signif(sample(1e5:5e5, 10, replace=TRUE), 2)
)

villas <- grep("villas", df$address, ignore.case = TRUE, value=TRUE)
df$is.villa <- ifelse(df$address %in% villas, 1, 0)

> df
   city       address beds  price is.villa
1     I    VIP Villas    5 270000        1
2     H castle villas    1 260000        1
3     J    VIP Villas    2 250000        1
4     D       nothing    6 410000        0
5     F       nothing    3 350000        0
6     I    VIP Villas    1 190000        1
7     H castle villas    4 140000        1
8     J    VIP Villas    1 480000        1
9     D       nothing    5 260000        0
10    F       nothing    5 490000        0
0 голосов
/ 04 июня 2018

Можно составить объединенное слово, используя |, отдельно и использовать в качестве pattern (regex) аргумент grepl для поиска наличия любого из двух слов.

villas <- c("villas", "Villas")

df$IsVilla <- grepl(paste(villas, collapse = "|"), df$address)

df

#        City          address beds  price IsVilla
# 1 San Diego    4 Main street    4 400000   FALSE 
# 2 San Diego 12 Castle Villas    3 250000    TRUE

Данные:

df <- read.table(text =
"City        address         beds   price
'San Diego'   '4 Main street'    4        400000
'San Diego'   '12 Castle Villas' 3        250000",
stringsAsFactors = FALSE, header = TRUE)
0 голосов
/ 04 июня 2018

Как предлагает @James, вы можете использовать grepl() и mutate() в рамках подхода tidyverse.

Пример с набором данных mtcars:

require(tidyverse)

mtcars %>% 
  select(mpg) %>%
  rownames_to_column("car") %>%
  mutate(MazdaORNot = as.integer(grepl("Mazda", car))) %>% 
  head()

                car  mpg MazdaORNot
1         Mazda RX4 21.0          1
2     Mazda RX4 Wag 21.0          1
3        Datsun 710 22.8          0
4    Hornet 4 Drive 21.4          0
5 Hornet Sportabout 18.7          0
6           Valiant 18.1          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...