[英]Create a new data frame column based on the values of another column
假设我有以下数据框。
dat <- data.frame(city=c("Chelsea","Brent","Bremen","Olathe","Lenexa","Shawnee"),
tag=c(rep("AlabamaCity",3), rep("KansasCity",3)))
我想包括第三列,Tag2,它将是每个 state 来自 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)
}
谢谢您的帮助。
它不起作用,因为您创建Words
的strsplit()
是错误的。 (你知道如何调试 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
,您的 function 没有改变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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.