Создайте новый столбец фрейма данных на основе значений другого столбца. - PullRequest
1 голос
/ 06 июля 2011

Допустим, у меня есть следующий фрейм данных.

dat <- data.frame(city=c("Chelsea","Brent","Bremen","Olathe","Lenexa","Shawnee"), 
        tag=c(rep("AlabamaCity",3), rep("KansasCity",3)))

Я хочу включить третий столбец, Tag2, который будет регионом, в котором находится каждое состояние из столбца Tag.Таким образом, первые три города получат название «Юг», а последние три - «Средний Запад».Данные будут выглядеть следующим образом.

     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

Я попробовал следующие команды, но новый столбец не создается.Может кто-нибудь сказать мне, что не так.

fixit <- function(dat) {
     for (i in 1:nrow(dat)) {
          Words = strsplit(as.character(dat[i, 'tag']), " ")[[1]]
          if(any(Words == 'Alabama')) {
                dat[i, 'tag2'] <- "South"
          }
          if(any(Words == 'Kansas')) {
                dat[i, 'tag2'] <- "Midwest"
          }
     }
     return(dat)
}

Спасибо за помощь.

1 Ответ

3 голосов
/ 06 июля 2011

Это не работает, потому что ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...