两个数据帧之间的值匹配

时间:2017-10-29 03:57:29

标签: r for-loop

我越来越熟悉R并碰到了我以前没想过的东西。在线阅读和搜索并没有让我更接近解决方案。

目标:获取源表(s_col)中的每一行,并将其与目标表(t_col)中的每一行进行匹配。创建一个新的df,其中1表示匹配,0表示没有匹配或源值为NA。

数据:

    > s_col<-data.frame(col1=c("Bob", "aunt"), 
    col2= ("likes", "Cathy"), col3 = c(NA, "tea"))

    > s_col
       col1  col2 col3
    1  Bob likes  tea
    2 aunt Cathy <NA>
    3 Tom  wins   twice

    > t_col<-data.frame(col1=c("Bob", NA, "likes", "tea", "Jack"), 
    col2=c("Cathy", "aunt", "Jason", "Bob", "likes"))

    > t_col
       col1  col2
    1   Bob Cathy
    2  <NA>  aunt
    3 likes Jason
    4   tea   Bob
    5  Jack likes

期望的结果:

    #output for first row in s_col (Bob, likes, tea)

       col1  col2
    1   1    0
    2   0    0
    3   1    0
    4   1    1
    5   0    1 

    #output for 2nd row in s_col (aunt, Cathy, NA)

       col1  col2
    1   0    1
    2   0    1
    3   0    0
    4   0    0
    5   0    0

    #output for 3nd row in s_col (Tom, wins, twice)

       col1  col2
    1   0    0
    2   0    0
    3   0    0
    4   0    0
    5   0    0

到目前为止,这是我所取得的进展,但下面的代码远非预期的结果:

    out<-NULL
    output<-NULL
    for(i in 1:ncol(s_col)){
      x<-i
      for(j in 1:nrow(s_col)){
        y<-j 
        temp<- s_col[y,x]
        for(a in 1:ncol(t_col)){
          w<-a
           for(b in 1:nrow(t_col)){
            v<-b 
            temp2<- t_col[v,w]}}
         put<-ifelse(temp %in% temp2, 1, 0)
        out<-c(out,put)
      }

1 个答案:

答案 0 :(得分:2)

我们可以遍历s_col行,然后使用%in%与&#39; t_col&#39;的列进行比较。创建list逻辑matric es

lapply(seq_len(nrow(s_col)), function(i) +sapply(t_col, `%in%`, unlist(s_col[i,])))
#[[1]]
#     col1 col2
#[1,]    1    0
#[2,]    0    0
#[3,]    1    0
#[4,]    1    1
#[5,]    0    1

#[[2]]
#     col1 col2
#[1,]    0    1
#[2,]    1    1
#[3,]    0    0
#[4,]    0    0
#[5,]    0    0

#[[3]]
#     col1 col2
#[1,]    0    0
#[2,]    0    0
#[3,]    0    0
#[4,]    0    0
#[5,]    0    0

数据

s_col<-data.frame(col1=c("Bob", "aunt", "Tom"), 
   col2= c("likes", "Cathy", "wins"), col3 = c("tea", NA, "twice"), stringsAsFactors=FALSE)