我试图将一个循环嵌套在另一个循环中并突破内循环,并在满足条件时继续使用外循环。我的数据框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个零的列向量,后跟3个1。但是上面的代码并没有在内部循环中的break语句之后跳过命令。
感谢任何帮助,找出这里有什么问题。
答案 0 :(得分:5)
问题是如果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)
}
..然后为了进一步简化它,你也可以删除外部循环:
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]])
答案 1 :(得分:4)
在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
答案 2 :(得分:4)
根本不需要循环。这是ifelse
的用途。
a_2011$City <- ifelse( a_2011[,1] %in% TRS[,1], 1, 0)