我正在尝试将一个循环嵌套在另一个循环中,并在满足条件时中断内循环并继续执行外循环。我的数据帧a_2011和TRS的格式如下:
a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
for (i in 1:nrow(a_2011))
{
a_2011$City[i] <- 1
for (j in 1:nrow(TRS))
{
if ( as.character(a_2011[i,1]) == as.character(TRS[j,1]) )
{
break
}
else
{
a_2011$City[i] <- 0
}
}
}a_2011$City的期望输出是一个由2个0和3个1组成的列向量。但是上面的代码并没有跳过内循环中break语句之后的命令。
希望您能帮助我们找出这里的问题所在。
发布于 2011-12-09 13:35:53
问题是,只有当第一行TRS匹配时,内部循环才会中断。要让你的代码正常工作,你必须这样做:
a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
for (i in 1:nrow(a_2011))
{
flag <- 0
for (j in 1:nrow(TRS))
{
if ( as.character(a_2011[i,1]) == as.character(TRS[j,1]) )
{
flag <- 1
break
}
}
a_2011$City[i] <- flag
}您可以不再需要内部循环,如下所示:
a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
for (i in 1:nrow(a_2011))
{
flag <- any(as.character(a_2011[i,1]) == as.character(TRS[,1]))
a_2011$City[i] <- as.numeric(flag)
}..And为了进一步简化它,您还可以删除外部循环:
a_2011<- data.frame(c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1"))
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33"))
a_2011$City <- as.numeric(a_2011[[1]] %in% TRS[[1]])发布于 2011-12-09 13:39:13
在R中不需要循环就可以做到这一点。
a_2011<- c("10N11W11", "10N11W11", "10N12W7", "10N13W22" , "10N14W1")
TRS <- data.frame(c("10N12W7","10N13W22","10N14W1", "10N15W33")
city <- rep(0, 5)
city[a_2011 %in% TRS] <- 1发布于 2011-12-09 16:14:35
你根本不需要循环。这就是ifelse的用途。
a_2011$City <- ifelse( a_2011[,1] %in% TRS[,1], 1, 0)https://stackoverflow.com/questions/8441430
复制相似问题