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
提供优秀的性能来处理大数据。