2016-12-06 29 views
0

在此先感謝您提供的任何和所有幫助。 我有一個相對較大的數據集,我想測試每個sting是否存在於從一個更大的數據集創建的一系列子集數據框中。 我能夠在三個步驟中完成此操作,但是我想寫一段代碼來完成這一步。創建一個新列並根據所提供的條件輸入1或0

由於我的文件的大小我想 創建子文件t2.a的用法是在我的文件t1中添加一個1或0,刪除它; 然後重複這個過程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 == gttest1

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

不是我想到的。我希望如果在test1 $ NM中找到來自test2 $ p1或test2 $ p2的名稱,對於它在test1 $ NM中存在的每個實例 ,請檢查每個相應的test1 $ D單元以查看是否存在任何「gt」其中。 如果在任何test1 $ NM實例中相應的test1 $ D單元具有「gt」,我想將1放置在NC列中,否則放置0。 現有的代碼似乎並不考慮test2 $ p2的名稱,並且似乎只是第一次出現,其中名稱test2 $ p1 顯示在test1 $ NM中,並非所有時間名稱都顯示在test1 $ NM中。 –

+0

輸出應該是這樣的 P1,P2,OI NC 1個JAES果凍1 1 2撬喬2 1 3喬NA 3 1 4 eleder NA 4 0 5食品阿5 0 6果凍果凍6 0 其中第一個獲得test2的1分之1加元$ p1 第二個獲得test2中的1分之一tommy $ p1 第三個得到1分之一的joe在test2 $ p2 我想查看所有名字,從 test2 $ p1或test2 $ p2出現在test1 $ NM不僅僅是第一次出現 ,並測試相應test1 $ D是否存在「gt」。 –

+0

我很抱歉,如果我關注,我不確定。你介意在原始問題中添加期望的列作爲輸出嗎? –

相關問題