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