Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R查找数据帧中某些列与另一列匹配的行_R_Dataframe_Subset - Fatal编程技术网

R查找数据帧中某些列与另一列匹配的行

R查找数据帧中某些列与另一列匹配的行,r,dataframe,subset,R,Dataframe,Subset,我有一个R问题,我甚至确定如何用一句话来表达,但还没有找到答案 我有两个数据框,我想“相交”并在两列中查找列值匹配的所有行。我已经尝试用&&连接两个intersect()和which()语句,但它们都没有满足我的要求 这就是我的意思。假设我有两个数据帧: > testData Email Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed 1 stack@overflow.com

我有一个R问题,我甚至确定如何用一句话来表达,但还没有找到答案

我有两个数据框,我想“相交”并在两列中查找列值匹配的所有行。我已经尝试用&&连接两个intersect()和which()语句,但它们都没有满足我的要求

这就是我的意思。假设我有两个数据帧:

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 stack@overflow.com EIFLS0LS        1       0      0       0         0            0
2 stack@exchange.com EIFLS0LS        1       0      0       0         0            0
3     data@frame.com EIFLS0LS        1       0      0       0         0            0
4    block@quote.com EIFLS0LS        1       0      0       0         0            0
5          ht@ml.com EIFLS0LS        1       0      0       0         0            0
6     tele@phone.com EIFLS0LS        1       0      0       0         0            0

> testBounced
               Email Campaign
1 stack@overflow.com        1
2 stack@overflow.com        2
3     data@frame.com        2
4    block@quote.com        1
5          ht@ml.com        1
6        lap@top.com        1
如您所见,电子邮件列中的某些值相交,而活动列中的某些值相交。我想要testData中两列都匹配的所有行

即:

编辑:

我查找这些列的目标是能够更新原始列中的一行。所以我想要的最终输出是:

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 stack@overflow.com EIFLS0LS        1       1      0       0         0            0
2 stack@exchange.com EIFLS0LS        1       0      0       0         0            0
3     data@frame.com EIFLS0LS        1       0      0       0         0            0
4    block@quote.com EIFLS0LS        1       1      0       0         0            0
5          ht@ml.com EIFLS0LS        1       1      0       0         0            0
6     tele@phone.com EIFLS0LS        1       0      0       0         0            0
如果这是重复的,我深表歉意,并提前感谢您的帮助

编辑2::


我最终只是使用了一个for循环,没有什么了不起的,但感觉效率不高。不过,数据集足够小,可以快速完成。如果有人有一个快速,R风格的方式来做这件事,我很高兴看到它

您需要函数
merge

merge
通常用于将两个表合并为一个类似的公共表,但是
by
参数可以允许多列:

merge(testData, testBounced, by=c("Email", "Campaign"))
默认情况下,不匹配的所有对
电子邮件
活动
。这可以由参数
all.x
all.y
控制,默认为
FALSE


by
的默认参数是
intersect(names(x,y))
,因此从技术上讲,在本例中不需要指定列,但这有助于清晰明了。

如果使用
data.tables
并按要匹配的列键入,则可以在一行中完成目标:

    tData[tBounce, Bounced := 1L]


以下是整个过程:
merge(testData,testbounched)
很抱歉,我没有看到SenorO回复底部的评论谢谢你的评论。我意识到我还不清楚——我的目标是能够更改原始表中其他列(在本例中为testData)中工作列的值。我将更新原始问题。我知道必须有一个简单的方法。谢谢你给我介绍这个包裹+1:X[Y,foo]语法的巧妙使用这太棒了!!我做了一些类似于使用“匹配”在一列上选择的事情,但试图将其扩展到在>1列上选择(或子集设置或我们想称之为的任何东西),这真的让我很为难。我对这个解决方案非常感兴趣。在我的例子中,我希望在另一个数据帧的三列中找到一个数据帧的列值匹配的所有行。但是,我不明白为什么会有“反弹:=1L”。谢谢你的帮助。嗨@Marine,也许最好打开一个新问题并链接回这个问题
    tData[tBounce, Bounced := 1L]
library(data.table)
keys <- c("Email", "Campaign")
tData <- data.table(testData, key=keys)
tBounce <- data.table(testBounce, key=keys)

tData[tBounce, Bounced := 1L]
tData

                Email   Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1:    block@quote.com EIFLS0LS        1       1      0       0         0            0
2:     data@frame.com EIFLS0LS        1       0      0       0         0            0
3:          ht@ml.com EIFLS0LS        1       1      0       0         0            0
4: stack@exchange.com EIFLS0LS        1       0      0       0         0            0
5: stack@overflow.com EIFLS0LS        1       1      0       0         0            0
6:     tele@phone.com EIFLS0LS        1       0      0       0         0            0
>