根据特定条件与dataframe2匹配的有效方式来更新dataframe1中的特定行

时间:2019-08-23 19:24:32

标签: r dataframe

我有2个大小不等的数据帧,并且df1的值用逗号分隔。

df1 <- data.frame(col1=c("id1", "id2", "id3", "id4", "id5", "id6", "id7"),
                  col2=c("1,2", "2", "1,2,3", "1,2,3,4,5", "4", "2", "1"))

Output of df1
-----------------
  col1      col2
1  id1       1,2
2  id2         2
3  id3     1,2,3
4  id4 1,2,3,4,5
5  id5         4
6  id6         2
7  id7         1


df2 <- data.frame(col1=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
                  col2=c("id1", "id1", "id1", "id1", "id1", "id1", "id2", "id3", "id3", "id4", "id4", "id4", "id5", "id6", "id7", "id7"), 
                  col3=c(1, 1, 1, 2, 3, 4, 2, 4, 2, 1, 4, 5, 1, 1, 2, 3))

df2$newCol <- 0

Output of df2
---------------
   col1 col2 col3 newCol
1     1  id1    1      0
2     2  id1    1      0
3     3  id1    1      0
4     4  id1    2      0
5     5  id1    3      0
6     6  id1    4      0
7     7  id2    2      0
8     8  id3    4      0
9     9  id3    2      0
10   10  id4    1      0
11   11  id4    4      0
12   12  id4    5      0
13   13  id5    1      0
14   14  id6    1      0
15   15  id7    2      0
16   16  id7    3      0

如果以下条件满足df2 $ col2 == df1 $ col1和df2 $ col3%in%df2 $ col2中的值,而其余应为0,我想用1更新'newCol'行。

这是我期望的输出

    col1 col2 col3 newCol
1     1  id1    1      1
2     2  id1    1      1
3     3  id1    1      1
4     4  id1    2      1
5     5  id1    3      0
6     6  id1    4      0
7     7  id2    2      1
8     8  id3    4      0
9     9  id3    2      1
10   10  id4    1      1
11   11  id4    4      1
12   12  id4    5      1
13   13  id5    1      0
14   14  id6    1      0
15   15  id7    2      0
16   16  id7    3      0

我试图在其自己的行中使用不必要的df1值并使用合并,但它似乎没有按预期工作。

任何有效实现此目标的建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以使用grepl来检测矢量是否在col2中。将merge添加数据后

transform(merge(df2,df1,by.x="col2",by.y="col1"),newcol = +Vectorize(grepl)(col3,col2.y))[-4]

   col2 col1 col3 newcol
1   id1    1    1      1
2   id1    2    1      1
3   id1    3    1      1
4   id1    4    2      1
5   id1    5    3      0
6   id1    6    4      0
7   id2    7    2      1
8   id3    8    4      0
9   id3    9    2      1
10  id4   10    1      1
11  id4   11    4      1
12  id4   12    5      1
13  id5   13    1      0
14  id6   14    1      0
15  id7   15    2      0
16  id7   16    3      0