根据另一列的值创建新的数据框列

时间:2011-07-06 16:17:57

标签: r dataframe

假设我有以下数据框。

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 个答案:

答案 0 :(得分:3)

它无效,因为您创建strsplit()的{​​{1}}错误。 (你知道如何调试R函数不是吗?)

Words

此时,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"条款永远不会被执行。 R 返回if(),您的函数不是更改 dat

这将为您完成,并且更通用一些。首先创建一个数据框,用于保存匹配的单词和区域

dat

循环遍历此数据框的行,匹配region <- data.frame(tag = c("Alabama","Kansas"), tag2 = c("South","Midwest"), stringsAsFactors = FALSE) 并插入相应的"tag" s:

"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"]) 元素与字符串“Alabama”匹配:

"tag"