2011-07-06 256 views
1

假设我有以下数据框。根据另一列的值创建一个新的数据框列

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

我想包括第三列Tag2,它将是每个状态来自标记列的区域。所以前三个城市最终将成为'南部',最后三个将成为'中西部'。数据看起来像。

 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) 
} 

感谢您的帮助。

回答

3

它不工作,因为你的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" S和插入适当"tag2" S:

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 
+0

我应该加;你的'strsplit()'失败的原因是''tag''元素中没有空格'''',因此这些字符串没有被分割。你在某个地方犯了一个错字吗? –

+0

感谢您的帮助。我仍然不知道如何在R中进行调试,但我想我必须开始研究这个问题。 – ATMathew

+0

好的 - 最简单的事情,我在这里做的只是运行'debug(fixit)'然后'fixit(dat)',它会让你进入调试器,你可以一次一行地执行代码。 –

相关问题