R – 使用grepl和相同的嵌套for循环多条件

我试图用“1”来标记所有的水果,否则只有一个国家提供或“0”。

我有两个数据表:

表格1:

水果 – 每行都有不同的水果,例如苹果,香蕉,桃子等。

国家 – 每行都有2位iso格式的水果主要供应国,例如美国,英国,NO等。

SourceUnique – 这是我想用“1”填充行的列,只有一个国家提供水果,否则为“0”。

表2:

国家/地区 – 每行都有最后一个表格的2位iso格式的供应商国家/地区。

用品 – 每行都有供应商交付的水果清单,例如第一行是“苹果,香蕉”,第二行是“菠萝,桃,梨,苹果”等。

这两个表都从CSV文件导入,那么我的代码如下:

Table1$SourceUnique=rep(1,length(Table1$Country)) for(i in 1:length(Table1$Country)){ for(k in 1:length(Table2$Country)){ if(grepl(Table1$Fruit[i], Table2$Supplies[k])==TRUE && identical(Table1$Country[i], Table2$Country[k])==FALSE){ Table1$SourceUnique[i]=0 } } } 

我没有得到任何错误,但SourceUnique列没有正确填写。 我得到1和0与一些正确的和其他人没有。 经过大量的search和调整,我已经接受了我不知道和需要帮助,所以任何build议或解决scheme将是太棒了。

谢谢。

编辑更多信息:

有些水果有来自同一个国家的许多供应商,表2 $供应杂乱地与其他词在它烦人。

示例数据:

 Table1$Country <- c("UK","US","NO") Table1$Fruit <- c("Apple","Banana","Pear") Table2$Country <- c("UK","US","UK") Table2$Supplies <- c("Apple,Pear","Banana,Pear","Banana and Apple") 

再次编辑:

当我使用数字分别运行它们时,grep和相同的代码在我的代码中。 我不明白为什么他们不工作在我的循环…理论上我的代码循环通过“耗材”,search这两个标准,并返回一个0,当两个标准都满意。 然后移动到下一个我(“水果”)并重复。 也许&&是我的问题? 从我的知识来看似乎是正确的。

一个Excel解决scheme也适用于我的目的,但我没有足够的经验与Excel知道从哪里开始。

也许你可以通过计算每个国家表2中每种水果的出现来简化问题:

 for (i in Table1$Fruit){ as.integer(rowSums(table(grepl(i,Table2$Supplies),Table2$Country))[2]==1) } 

这给了你1水果,每个国家在表2中只发生一次,否则0

假设可以构造一个正则expression式来从实际数据的Supplies列中提取“fruit”的值,下面是对这个问题的数据操纵方法。

 # prepare your sample data fruit <- suppliers <- list() fruit$Fruit <- c("Apple","Banana","Pear") fruit$Country <- c("UK","US","NO") fruit <- data.frame(fruit) suppliers$Country <- c("UK","US","UK") suppliers$Supplies <- c("Apple,Pear","Banana,Pear","Banana and Apple") suppliers <- data.frame(suppliers) library(dplyr) library(tidyr) # version 0.5.0 or later # data manipulation for the desired result suppliers %>% # split values of Supplies into a new row at each occurance of sep separate_rows(Supplies, sep = "\\s*(and|,)\\s*") %>% group_by(Supplies) %>% # summarize which fruit are supplied from only one country summarize(SourceUnique = as.numeric(n_distinct(Country) == 1)) %>% left_join(fruit, ., by = c("Fruit" = "Supplies")) # Fruit Country SourceUnique # 1 Apple UK 1 # 2 Banana US 0 # 3 Pear NO 0 

如果需要速度,同样可能使用data.table提供优秀的性能来处理大数据。