我试图用“1”标记所有水果,如果它只由一个国家提供或者“0”提供。
我有两个数据表:
表1:
水果 - 每行中都有不同的水果,例如Apple,Banana,Peach等......
国家/地区 - 每行都有2位iso格式的水果主要供应国家/地区,例如美国,英国,NO等......
SourceUnique - 这是我要在水果行中填充“1”的列,只有一个国家/地区提供,否则为“0”。
表2:
国家/地区 - 每行都有2位iso格式的供应商国家/地区,如上一张表格。
耗材 - 每行都有供应商提供的水果列表,例如第1行是“Apple,Banana”,第2行是“Pineapple,Peach,Pear,Apple”等......
两个表都是从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的一些正确而其他没有。经过大量的搜索和讨论,我已经接受了我不知道并需要帮助,所以任何建议或解决方案都会很棒。
感谢。
编辑以获取更多信息:
有些水果有来自同一个国家的许多供应商和Table2 $供应中的其他单词很烦人。
示例数据:
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")
再次编辑:
当我用数字单独运行时,我的代码中的grepl和相同的工作。我无法理解为什么它们不能在我的循环中工作......理论上我的代码循环通过“Supplies”,搜索两个条件并在满足两个条件时返回0。然后它继续前进到下一个i(“果实”)并重复。也许&amp;&amp;是我的问题?从我的知识来看似乎是正确的。Excel解决方案也可以用于我的目的,但我对Excel的经验不足以知道从哪里开始。
答案 0 :(得分:0)
也许您可以通过计算每个国家/地区表2中每种水果的出现次数来简化问题:
for (i in Table1$Fruit){
as.integer(rowSums(table(grepl(i,Table2$Supplies),Table2$Country))[2]==1)
}
这为您提供1
表示仅在表2中每个国家/地区出现一次的水果,否则为0
。
答案 1 :(得分:0)
假设可以构造一个正则表达式来从真实数据中的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
来制定相同速度,这可以为处理大数据提供出色的性能。