假设我有以下数据框。
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)
}
感谢您的帮助。
答案 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"