不按顺序在R中匹配
我尝试在R中进行匹配,而不考虑列的顺序 基本上,我试图解决的问题是,如果df2列中从第2列到最后的所有值都在df1中找到(在不按顺序在R中匹配,r,dplyr,match,melt,R,Dplyr,Match,Melt,我尝试在R中进行匹配,而不考虑列的顺序 基本上,我试图解决的问题是,如果df2列中从第2列到最后的所有值都在df1中找到(在Partner之后),则匹配df1 问题是:在进行匹配时,忽略每行中最后一个非NA值,但将其包含在最终输出中。因此,在进行匹配时,不要考虑最后一个非NA值,而是将其包含在内 匹配后,确定最后一个非na值是否存在于其相应行的任何列中 df1 Partner Col1 Col2 Col3 Col4 A A1 A2 NA
Partner
之后),则匹配df1
问题是:在进行匹配时,忽略每行中最后一个非NA值,但将其包含在最终输出中。因此,在进行匹配时,不要考虑最后一个非NA值,而是将其包含在内
匹配后,确定最后一个非na值是否存在于其相应行的任何列中
df1
Partner Col1 Col2 Col3 Col4
A A1 A2 NA NA
B A2 B9 NA NA
C B7 V9 C1 N9
D Q1 Q3 Q4 NA
df2
lift rule1 rule2 rule3
11 A2 A1 A9
10 A1 A3 NA
11 B9 A2 D7
10 Q4 Q1 NA
11 A2 B9 B1
如何将df1与df2匹配,以便发生以下情况:
1) 忽略在两个数据帧中找到的列的顺序
2) 然后确定当前行中是否存在最后一个非na值
最终输出:
df3
我比你多得到一个B匹配,但是这个解决方案非常接近你想要的。在我们使用id列重建数据时,首先必须添加id列。然后,要执行匹配,首先需要使用
tidyr
中的gather
将其熔化,然后使用inner\u join
从dplyr
中进行。然后,我们使用ID和原始的data.frames
来cbind
library(tidyr);library(dplyr)
df1 <- read.table(text="Partner Col1 Col2 Col3 Col4
A A1 A2 NA NA
B A2 B9 NA NA
C B7 V9 C1 N9
D Q1 Q3 Q4 NA",header=TRUE, stringsAsFactors=FALSE)
df2 <- read.table(text="lift rule1 rule2 rule3
11 A2 A1 A9
10 A1 A3 NA
11 B9 A2 D7
10 Q4 Q1 NA
11 A2 B9 B1",header=TRUE, stringsAsFactors=FALSE)
df1 <- cbind(df1_id=1:nrow(df1),df1)
df2 <- cbind(df2_id=1:nrow(df2),df2)
#melt with gather
d11 <- df1 %>% gather(Col, Value,starts_with("C")) #Long
d11 <- d11 %>% na.omit() %>%group_by(df1_id) %>% slice(-n()) #remove last non NA
d22 <- df2 %>% gather(Rule, Value,starts_with("r")) #Long
res <- inner_join(d11,d22)
cbind(df1[res$df1_id,],df2[res$df2_id,])
df1_id Partner Col1 Col2 Col3 Col4 df2_id lift rule1 rule2 rule3
1 1 A A1 A2 <NA> <NA> 2 10 A1 A3 <NA>
1.1 1 A A1 A2 <NA> <NA> 1 11 A2 A1 A9
2 2 B A2 B9 <NA> <NA> 1 11 A2 A1 A9
2.1 2 B A2 B9 <NA> <NA> 5 11 A2 B9 B1
2.2 2 B A2 B9 <NA> <NA> 3 11 B9 A2 D7
4 4 D Q1 Q3 Q4 <NA> 4 10 Q4 Q1 <NA>
library(tidyr);图书馆(dplyr)
你能解释一下df3$Col3中的A4是从哪里来的吗?它不在df1或DF2中,对此表示担忧,只是编辑了它。感谢您关注这一点。我知道这看起来很复杂……你能解释一下A在df3中是如何匹配两次的吗?因此,如果你忽略规则中的最后一个值,你有两种情况:1)规则1中的A2和A1以及规则2都出现在合作伙伴A中。2)规则1中的A1也出现在合作伙伴A中。我基本上需要将df2与df1进行匹配,忽略df2中每行的最终值。让我知道这是否有意义。你就是那个男人!还有最后一个问题,如何确定该行中是否存在最后一个非na值?填充YES或NOPE。我将在单独的问题中问这个问题。我不能感谢你,因为它实际上并没有做我想做的事情。更仔细地看一下,它会发布一个不同的问题
library(tidyr);library(dplyr)
df1 <- read.table(text="Partner Col1 Col2 Col3 Col4
A A1 A2 NA NA
B A2 B9 NA NA
C B7 V9 C1 N9
D Q1 Q3 Q4 NA",header=TRUE, stringsAsFactors=FALSE)
df2 <- read.table(text="lift rule1 rule2 rule3
11 A2 A1 A9
10 A1 A3 NA
11 B9 A2 D7
10 Q4 Q1 NA
11 A2 B9 B1",header=TRUE, stringsAsFactors=FALSE)
df1 <- cbind(df1_id=1:nrow(df1),df1)
df2 <- cbind(df2_id=1:nrow(df2),df2)
#melt with gather
d11 <- df1 %>% gather(Col, Value,starts_with("C")) #Long
d11 <- d11 %>% na.omit() %>%group_by(df1_id) %>% slice(-n()) #remove last non NA
d22 <- df2 %>% gather(Rule, Value,starts_with("r")) #Long
res <- inner_join(d11,d22)
cbind(df1[res$df1_id,],df2[res$df2_id,])
df1_id Partner Col1 Col2 Col3 Col4 df2_id lift rule1 rule2 rule3
1 1 A A1 A2 <NA> <NA> 2 10 A1 A3 <NA>
1.1 1 A A1 A2 <NA> <NA> 1 11 A2 A1 A9
2 2 B A2 B9 <NA> <NA> 1 11 A2 A1 A9
2.1 2 B A2 B9 <NA> <NA> 5 11 A2 B9 B1
2.2 2 B A2 B9 <NA> <NA> 3 11 B9 A2 D7
4 4 D Q1 Q3 Q4 <NA> 4 10 Q4 Q1 <NA>