2016-12-06 1 views
0

Заранее благодарим за предоставленную любую помощь. У меня есть относительно большие наборы данных, и я хочу проверить, существует ли каждая строка в серии подмножеств, которые были созданы из большего набора данных. Я могу выполнить это за три шага, но я хотел бы написать фрагмент кода, который делает это за один шаг.создайте новый столбец и введите 1 или 0 на основании предоставленных условий.

Из-за размера моих файлов я хотел бы создать суб-файл t2.a use - добавить 1 или 0 в мой файл t1, удалить его; затем повторить процесс t2.b, t2.c ...

Снова благодаря

Мои фактические наборы данных напоминают ниже dataframes.

t1<- data.frame (A1 = c("red", "blue", "green", "yellow", "brown"), 
        A2 = c("orange", "purple", "yellow", "black", NA), 
        A3 = c(1,2,4,5,7)) 

    t2<- data.frame(B2 = c("black", "pink", "lime", "green", "grey", "mist", "blond", "grass", "violet", "red"), 
        B3 = c("a", "b", "a", "c", "d", "d", "a" , "c", "a", "b")) 

    > t1 
      A1  A2 A3 
    1 red orange 1 
    2 blue purple 2 
    3 green yellow 4 
    4 yellow black 5 
    5 brown <NA> 7 
    > t2 
      B2 B3 
    1 black a 
    2 pink b 
    3 lime a 
    4 green c 
    5 grey d 
    6 mist d 
    7 blond a 
    8 grass c 
    9 violet a 
    10 red b 

# Мой существующий код три шага

# step 1. creates a subset of files 
     for(i in unique(t2$B3)) { 
     colName <- paste("t2", i, sep = ".") 
     assign(colName, t2[t2$B3==i,]) 

     } 

    # step2. find if string exist in a given subfile 
    t1$t2.a<- ifelse(t1$A1 %in% t2.a$B2|t1$A2 %in% t2.a$B2,1,0) 
    # 
    t1$t2.b<- ifelse(t1$A1 %in% t2.b$B2|t1$A2 %in% t2.b$B2,1,0) 
    # 
    t1$t2.c<- ifelse(t1$A1 %in% t2.c$B2|t1$A2 %in% t2.c$B2,1,0) 
    # 
    t1$t2.d<- ifelse(t1$A1 %in% t2.d$B2|t1$A2 %in% t2.d$B2,1,0) 

    # 3.remove each newly created data set 
    rm(t2.a) 
    rm(t2.b) 
    rm(t2.c) 
    rm(t2.d) 

    #The result should look like the dataframe below 
     A1  A2 A3 t2.a t2.b t2.c t2.d 
    1 red orange 1 0 1 0 0 
    2 blue purple 2 0 0 0 0 
    3 green yellow 4 0 0 1 0 
    4 yellow black 5 1 0 0 0 
    5 brown <NA> 7 0 0 0 0 
+0

Просьба показать ожидаемый результат – akrun

+0

Добро пожаловать в SO. Вы предпринимали какие-либо усилия, чтобы фактически запустить это? –

ответ

0

Я думаю, что там может быть что-то от с test2 вы печатаете на экране:

>test2 #OP's test2 printed 
     p1 p2 oi NC 
1 jaes jelly 1 1 
2 tommy joe 2 1 
3 NA Joe 3 1 
4 eleder NA 4 0 
5 food  A 5 0 
6 jelly jelly 6 1 

На основе Ваших данных я чувствую, что есть разница в третьей строке.

> test2 #test2 based on the provided data 
     p1 p2 oi 
1 jaes jelly 1 
2 tommy joe 2 
3 joe NA 3 
4 eleder NA 4 
5 food  A 5 
6 jelly jelly 6 

Кроме того, я не вижу joe как NM соответствующий D == gt где-нибудь в test1

test1[test1$NM == "joe", ] 
    D NM 
4 bk joe 
12 oo joe 

В любом случае, мое чрезмерно сложное решение для обеспечения p2 содействия ниже ,

test2$NC <- ifelse(test2$p1 %in% test1$NM & test2$p2 %in% test1$NM, 
        ifelse(any(test1$D[which(test1$NM %in% test2$p1)] == "gt") | 
          any(test1$D[which(test1$NM %in% test2$p2)] == "gt"), 1, 0), 0) 

> test2 
     p1 p2 oi NC 
1 jaes jelly 1 1 
2 tommy joe 2 1 
3 joe NA 3 0 
4 eleder NA 4 0 
5 food  A 5 0 
6 jelly jelly 6 1 

Примечание. Это не согласуется в третьей строке с ожидаемым результатом из-за проблемы, о которой я говорил выше.

+0

Не совсем то, что я имел в виду. Я хочу, чтобы имя test2 $ p1 или test2 $ p2 было найдено в test1 $ NM, для каждого экземпляра, который он излагает в test1 $ NM, проверьте каждую из соответствующих ячеек test1 $ D, чтобы увидеть, существует ли «gt» в любом из них. Если для любого из экземпляров test1 $ NM соответствующая ячейка test1 $ D имеет «gt», я бы хотел, чтобы 1 был помещен столбец NC, иначе 0 помещается. Код eisting, по-видимому, не учитывает имена test2 $ p2 независимо и только кажется увлекательным первым случаем, когда имя из test2 $ p1 появляется в test1 $ NM, но не все время, когда имя отображается в test1 $ NM. –

+0

вывод должен выглядеть следующим образом P1 P2 О.И. NC 1 jaes желе 1 1 2 томми Джо 2 1 3 джо Н.А. 3 1 4 eleder Н.А. 4 0 5 пищи в 5 0 6 желе желе 6 0 где 1-й получает 1 bc jaes теста2 $ p1 2nd получает 1 bc tommy в test2 $ p1 3rd получить 1 bc joe в test2 $ p2 Я хочу посмотреть все строки, что имя от test2 $ p1 или test2 $ p2 встречается в test1 $ NM не только в первом вхождении и проверяет, существует ли «gt» в соответствующем test1 $ D. –

+0

Прошу прощения, я не уверен, буду ли я следовать. Не возражаете ли вы добавить желаемый столбец в качестве результата в исходном вопросе? –