此代码正在生成
subset.default(sos1,grepl(m,sos1))中的错误:'子集'必须是合乎逻辑的
unik
包含c("900-12004-2501-000", "900-12004-2510-000", "900-12005-0120-000")
sos1
包含c("900-12004-2501-0008000FOX1 SFOX1", 900-12004-2510-0008000FOX1 SFOX1", 900-12005-0120-0008000FOX1 SFOX')
请帮助
x <- nrow(miss)
unik <- unique(miss$Material.Number)
unik1 <- as.character(unik)
sos <- read.xlsx("trprod.xlsx", sheet = 1)
sos1 <- as.character(sos$Source.of.Supply)
output <- c()
for (i in 1:x)
{
m <- (unik1[i])
result <- subset(sos1, grepl(m, sos1))
if (length(result) == 0 ){
print('in if')
output <- c(output, m)
}
}
答案 0 :(得分:1)
您收到错误消息,因为正在运行的变量i
从1运行到nrow(miss)
。由于应用了unik1
运算符,因此您的向量nrow(miss)
比unique
短。因此,当i
超过unik1
的长度时,循环中的变量m
变为NA
而grepl
会返回NA
的向量该类int
而不是logical
。这就是错误的来源。
您可以将x
更改为x <- length(unik1)
或 - 您确实需要遍历miss
的所有行 - 将subset
操作更改为
result <- subset(sos1, as.logical(grepl(m, sos1)))