当前位置: 首页 > 知识库问答 >
问题:

基于与dataframe2的特定条件匹配更新dataframe1中特定行的有效方法

华锦
2023-03-14

我有两个大小不等的数据帧,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%中%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值,并使用merge,但它似乎没有按预期工作。

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

共有1个答案

司英彦
2023-03-14

您可以使用grepl来检测向量是否在col2中。这将是在合并ing数据之后

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
 类似资料:
  • 问题内容: 我正在将SQLAlchemy与python结合使用,并且我想更新等于此查询的表中的特定行: 我通过sql alchemy编写了此代码,但无法正常工作: 返回此错误: 我该怎么做? 问题答案: 通常,您不使用,而是设置属性:

  • 通过特定的标签/键从整个JSON中删除任意值的简单方法是什么?我的JSON可能具有任意深度,因此按标签删除应该递归完成。 并且我想删除所有带有标签的元素,以便最终结果如下所示: 使用/会产生意想不到的结果(尤其是当有嵌套对象要删除时),因此它必须是一个支持JSON的实用工具,如jq或类似工具。

  • 我需要国家列表,其中没有城市或地方,这意味着所有的城市或地方的国家是空的或空的。不要国家,如果国家的一个记录有城市或地方价值。

  • 问题内容: 我一直在尝试更新特定行已有一段时间了,看来有两种方法可以做到这一点。根据我的阅读和尝试,你可以使用: 方法 或者: 方法。 (让我知道这是否不正确,因为我是android新手,还是SQL新手。) 因此,让我了解我的实际代码。 我正在努力做到这一点: 更新主键()等于1的Field1,Field2和Field3。 Eclipse在“更新”一词的正下方给了我一条红线,并给出了以下解释: S

  • 我有一个数据记录就像。data1=ID A B C D O T1 1 3 3 2 1 T2 2 4 2 3 3 0 T3 4 1 1 4 0 T4 5 2 4 5 0 T5 3 5 5 1 1 而其他数据是。 怎么做??

  • 我想获取一个使用。与相比,仅锁定指定表中的行,并且连接的行不会被阻塞。但是,当我尝试使用以下代码段使用ecto执行此操作时,它失败了。 原因是ecto为使用别名,例如,这意味着我还必须在lock表达式中使用别名才能使其正常工作。 使用别名看起来不是一种正确的方法。还有其他方法可以让它工作吗?