我有一个包含多列(ID,数字,位置,字段,权重)的数据框(df1) . 我还有另一个包含更多信息的数据帧(df2)(ID,PassRate,Number,Weight) .
我试图使用dplyr和%in%来过滤掉df1中与df2具有相同两个值的行 .
到目前为止我有:
df_sub <- subset(df1, df1$ID %in% df2$ID & df1$Weight %in% df2$Weight)
但这只是第一个条件的子集...任何想法为什么?
从问题和示例代码中,不清楚是否希望 df_sub 包含 df1 中的_1865804_中匹配的行,或者不匹配的行 . dplyr::semi_join() 将返回带匹配的行, dplyr::anti_join() 将返回没有匹配的行 .
df_sub
df1
dplyr::semi_join()
dplyr::anti_join()
df_sub <- semi_join(x=df1, y=df2, by=c("ID","Weight"))
要么
df_sub <- anti_join(x=df1, y=df2, by=c("ID","Weight"))
试试这个 ,
df1[paste0(df1$ID,df1$Weight)%in%paste0(df2$ID,df2$Weight),]
你正在做的是过滤 df1 的 df2 值,而不是找到行匹配
df2
试试这个样本数据
df1 ID Weight 1 a 2 b df2 ID Weight 1 b 2 a
使用你的功能
df_sub <- subset(df1, df1$ID %in% df2$ID & df1$Weight %in% df2$Weight) > df_sub ID Weight 1 2 b 2 1 a
实际上,它会返回下面的布尔值,这会导致所有 df1 值显示在 df2 上:
True True True True
使用我的,结果是没有人匹配:
df1[paste0(df1$ID,df1$Weight)%in%paste0(df2$ID,df2$Weight),] [1] ID Weight <0 rows> (or 0-length row.names)
2 回答
从问题和示例代码中,不清楚是否希望
df_sub
包含df1
中的_1865804_中匹配的行,或者不匹配的行 .dplyr::semi_join()
将返回带匹配的行,dplyr::anti_join()
将返回没有匹配的行 .要么
试试这个 ,
你正在做的是过滤
df1
的df2
值,而不是找到行匹配试试这个样本数据
使用你的功能
实际上,它会返回下面的布尔值,这会导致所有
df1
值显示在df2
上:使用我的,结果是没有人匹配: