Это не работает, потому что ваш strsplit()
для создания Words
неверен. (Вы ведь знаете, как отлаживать функцию R?)
debug: Words = strsplit(as.character(dat[i, "tag"]), " ")[[1]]
Browse[2]>
debug: if (any(Words == "Alabama")) {
dat[i, "Tag2"] <- "South"
}
Browse[2]> Words
[1] "AlabamaCity"
на данный момент, Words
определенно не равно "Alabama"
или "Kansas"
и никогда не будет, поэтому предложения if()
никогда не будут выполнены. R равен , возвращая dat
, ваша функция не изменяет dat
.
Это сделает это за вас, и будет немного более общим. Сначала создайте фрейм данных, содержащий сопоставленные слова с регионами
region <- data.frame(tag = c("Alabama","Kansas"), tag2 = c("South","Midwest"),
stringsAsFactors = FALSE)
Цикл по строкам этого фрейма данных, соответствующий "tag"
с и вставка соответствующих "tag2"
с:
for(i in seq_len(nrow(region))) {
want <- grepl(region[i, "tag"], dat[, "tag"])
dat[want, "tag2"] <- region[i, "tag2"]
}
Что приведет к этому:
> dat
city tag tag2
1 Chelsea AlabamaCity South
2 Brent AlabamaCity South
3 Bremen AlabamaCity South
4 Olathe KansasCity Midwest
5 Lenexa KansasCity Midwest
6 Shawnee KansasCity Midwest
Как это работает? Бит ключа grepl()
. Если мы сделаем это только для одного матча, "Alabama"
, grepl()
будет использоваться следующим образом:
grepl("Alabama", dat[, "tag"])
и возвращает логическое указание, какой из "tag"
элементов соответствует строке «Алабама»:
> grepl("Alabama", dat[, "tag"])
[1] TRUE TRUE TRUE FALSE FALSE FALSE