R 选择两列中部分匹配/不匹配的行
我正在研究如何选择R中两列中部分匹配或不匹配的行。我的数据集(例如)如下所示:R 选择两列中部分匹配/不匹配的行,r,dataframe,match,R,Dataframe,Match,我正在研究如何选择R中两列中部分匹配或不匹配的行。我的数据集(例如)如下所示: df = data.frame(plot1 = c("ABX_15", "BHE_05", "ABX_15"), plot2 = c("AB6_15", "JKS_05", "JKS_05"), value = c(0.4, 0.45, 0.34)) 我想为\u 05和\u 15创建仅包含plot1和plot2的“匹配”对的子集。因此,这将是示例中的
df = data.frame(plot1 = c("ABX_15", "BHE_05", "ABX_15"),
plot2 = c("AB6_15", "JKS_05", "JKS_05"),
value = c(0.4, 0.45, 0.34))
我想为\u 05
和\u 15
创建仅包含plot1
和plot2
的“匹配”对的子集。因此,这将是示例中的第一行或第二行。我还需要只选择在plot1
和plot2
中存在不匹配的行,即第三行。匹配错误匹配仅指绘图名称的第二部分
我已经找到了部分选择和根据列选择某些行的解决方案,但我无法将两者结合起来
我期望数据集有3个子集:一个是匹配的
\u 05
,另一个是匹配的\u 15
,还有一个是不匹配的。首先按照模式\u
将名称分开。我在这里使用的是来自stringr
包的函数stru split
。结果是一个列表。现在可以提取名称的第二部分。取消列表后,您可以将结果添加到数据帧df
:
df$p1 <- unlist(lapply(str_split(df$plot1, "_"), "[", 2))
df$p2 <- unlist(lapply(str_split(df$plot2, "_"), "[", 2))
结果是:
df[df$p1 == df$p2, ]
plot1 plot2 value p1 p2
1 ABX_15 AB6_15 0.40 15 15
2 BHE_05 JKS_05 0.45 05 05
对于不匹配使用:
df[df$p1 != df$p2, ]
plot1 plot2 value p1 p2
3 ABX_15 JKS_05 0.34 05 15
另一种解决方案是使用
sub
从两个变量中去除下划线之前(包括下划线)的所有内容,然后将这些sub
语句与=
进行比较,以创建逻辑索引向量:
idx <- sub('.*\\_', '', df$plot1) == sub('.*\\_', '', df$plot2)
要获取不匹配项,可以使用df[!idx,]
:
plot1 plot2 value
3 ABX_15 JKS_05 0.34
根据您的需求更新,您可以在
15
或05
上创建匹配索引,如下所示:
idx15 <- sub('.*\\_', '', df$plot1) == '15' & sub('.*\\_', '', df$plot2) == '15'
idx05 <- sub('.*\\_', '', df$plot1) == '05' & sub('.*\\_', '', df$plot2) == '05'
idx15预期的输出是什么?我预期数据集有3个子集:一个匹配_05,另一个匹配_15,还有一个匹配_15missmatches@NR不要在评论中发布其他信息,请利用下次更新您的问题。Thak’s for your update-我刚刚回答了评论中的问题。您的解决方案的调整不是问题。我做的有点不同,但它似乎也能工作:id05
plot1 plot2 value
3 ABX_15 JKS_05 0.34
idx15 <- sub('.*\\_', '', df$plot1) == '15' & sub('.*\\_', '', df$plot2) == '15'
idx05 <- sub('.*\\_', '', df$plot1) == '05' & sub('.*\\_', '', df$plot2) == '05'