Mam ramę danych (DF) z informacjami o domach. Jedną z zmiennych jest surowy adres dla każdego domu. Rama danych wygląda na coś takiego:

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

Niektóre adresy (które zakodowałem jako zmienną czynnikową, ale można go zmienić) zawierają słowo "wille" (lub "wille"). Chcę zidentyfikować wszystkie adresy domowe, które zawierają słowo "wille" i przypisz te do czegoś, i przypisz wszystkie inne nieruchomości do czegoś innego. Jest to do użytku w decyzyjnym drzewie do szacowania ceny domowej.

Obecnie staram się jak:

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

Ale to sprawdza, czy cały adres jest równy "wille", więc jest fałszywe dla wszystkich wpisów.

r
1
Macter 4 czerwiec 2018, 19:11

2 odpowiedzi

Najlepsza odpowiedź

Można zrobić połączone słowo za pomocą | oddzielnie i użyj argumentu pattern (regex), aby wyszukać obecność jednego z dwóch słów.

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

Dane:

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)
2
MKR 4 czerwiec 2018, 16:49

Jak sugerowano @james, możesz użyć grepl() i mutate(), pod podejściem tidyverse.

Przykład z zestawem danych {{x0}:

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
2
DJV 4 czerwiec 2018, 16:29