2016-12-06 64 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

我很抱歉,如果我关注,我不确定。你介意在原始问题中添加期望的列作为输出吗? –

相关问题