2016-06-20 17 views
1

Я пытаюсь отметить все фрукты с помощью «1», если оно предоставляется только одной страной или «0» в противном случае.R - Вложенные для циклов с несколькими условиями с использованием grepl и идентичны

У меня есть две таблицы данных:

Таблица 1:

Фрукты - Каждая строка имеет различные фрукты в нем, например, Apple, Banana, Peach и т. Д.

Страна - Каждая строка имеет основную страну поставки фруктов в 2-значном формате iso, например. США, Великобритании, НЕТ и т. Д.

SourceUnique - Это столбец, который я хочу заполнить «1» в строках с фруктами, которые поставляются только одной страной и «0» в противном случае.

Таблица 2:

Страна - Каждая строка имеет страну поставщиков в 2-значном формате, как изо последней таблицы.

Поставки - В каждой строке представлен список фруктов, поставляемых поставщиком, например. строка 1 является "Apple, банан", строка 2 является "ананас, персик, груша, яблоко", и т.д ...

Обе таблицы импортируются из 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 с некоторыми правильными, а другие нет. После многих поисков и беспорядков я согласился с тем, что я понятия не имею и не нуждаюсь в помощи, поэтому любые советы или решения были бы фантастическими.

Спасибо.

Edit для получения дополнительной информации:

Некоторые фрукты имеют много поставщиков из одной и той же страны и Table2 $ Supplies грязен с другими словами в нем раздражающе.

Пример данных:

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 и идентичные работы в моем коде, когда я запускаю их отдельно с номерами. Я не могу понять, почему они не работают в моих циклах ... Теоретически мой код проходит через «Принадлежности», выполняет поиск по двум критериям и возвращает 0, когда оба критерия выполнены. Затем он переходит к следующему i («плод») и повторяет. Может быть, & & - моя проблема? это кажется правильным из моих знаний.

Решение Excel также будет работать для моих целей, но я не достаточно опытен с Excel, чтобы знать, с чего начать.

+1

Привет, добро пожаловать в SO. Пожалуйста, прочитайте [ask] и как создать [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Это облегчает другим помощь вам. – Heroka

+0

Простите, я попытался создать небольшую таблицу данных с HTML, но, похоже, она не работала, поэтому я старался быть максимально описательным. Мои данные - инвесторы, а не фрукты, поэтому я не могу поделиться файлами CSV ... Две таблицы с 3 случайными рядами будут работать. – GoBuildAngus

+0

Каков ваш ожидаемый результат для данных данного примера? – user5249203

ответ

0

Возможно, вы можете упростить задачу путем подсчета вхождений каждого плода в таблице 2 для каждой страны:

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

Это дает вам 1 для тех фруктов, которые встречаются только один раз в каждой стране в таблице 2 и 0 иначе ,

+0

Спасибо, что ответили! Это будет работать для некоторых, но, к сожалению, некоторые фрукты имеют много поставщиков из одной страны. – GoBuildAngus

+0

Я вижу. Я обновляю соответствующим образом. Это не слишком разнородно. – jkt

0

Предполагая, что можно создать регулярное выражение для извлечения значений «фрукты» из столбца Supplies в ваших реальных данных, вот подход к обработке данных для этой проблемы.

# 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 S, которые обеспечивают превосходную производительность при работе с большими данными.

+0

Довольно трудно извлечь только имена фруктов из столбца «Поставки» ... В некоторых ячейках есть много комментариев. Большое вам спасибо за помощь! – GoBuildAngus

+0

Знаете ли вы, почему мой код не работает? – GoBuildAngus