【问题标题】:how to subset in r for this particular condition?对于这种特定条件,如何在 r 中进行子集化?
【发布时间】:2015-02-05 13:00:26
【问题描述】:

df1 和 df2 有 a、b 列。我想对 df1 中的数据进行子集化,以便 df1$a 和 df1$b 中的每个条目都在 df2$a 和 df2$b 中。

df1
a   b  c
1   m  df1
2   f  df1
3   f  df1
4   m  df1
5   f  df1
6   m  df1

df2
a   b  c
1   m  df2
3   f  df2
4   f  df2
5   m  df2
6   f  df2
7   m  df2

想要的输出

df
a   b  c
1   m  df1
3   f  df1

我正在使用:

df <- subset(df1,(df1$a%in%df2$a & df1$b%in%df2$b))

但这给出的结果类似于

df <-subset(df1,df1$a%in%df2$a)

【问题讨论】:

  • 可能是df1[(!df1$a %in% df2$a) &amp; (!df1$b %in% df2$b), ]
  • 我已经改变了问题。请再读一遍,这个方法也是和一个条件一样的结果。
  • 那么也许df1[(df1$a %in% df2$a) &amp; (df1$b %in% df2$b), ]
  • 请添加一个可重现的例子,包含你得到 ant=d 的输出你期望的输出。请参阅stackoverflow.com/questions/5963269/… 了解如何制作一个可重现的良好示例。
  • 您不能在每次获得有效解决方案时都编辑问题。

标签: r subset


【解决方案1】:

你可以使用包dplyr

library(dplyr)
intersect(df1,df2)
#  a b
#1 1 m
#2 3 f

编辑为带有c 列的新data.frames: 你可以使用函数semi_join(也来自dplyr):

semi_join(df1,df2,by=c("a","b"))
#  a b   c
#1 1 m df1
#2 3 f df1

其他选项,baseR
您可以将 ab 变量粘贴到您的 data.frame 中:

df1[paste(df1$a,df1$b) %in% paste(df2$a,df2$b), ]
#  a b
#1 1 m
#3 3 f

并使用新的 data.frames:

   #   a b   c
   # 1 1 m df1
   # 3 3 f df1

【讨论】:

  • 我的目标不是使用粘贴,因为它会增加运行时间。还有什么方法??
  • @VaibhavKaushal 是的,大卫的一个 ;-) 或带有包裹 dplyr,查看我的编辑
  • 我正在转过相交基础 R,但 dplyr 重载很好:)
  • @ColonelBeauvel,是的,我发现 dplyr setdiffintersect 对于 data.frames 的功能比 base R 的功能好得多(直观...)
  • @DavidArenburg,谢谢,确实不太合适;-)
【解决方案2】:

或者你可以这样做

Res <- rbind(df1, df2) 
Res[duplicated(Res), ]
#   a b
# 7 1 m
# 8 3 f

Edit1:根据编辑,这里有一个类似的data.table 解决方案

library(data.table)
Res <- rbind(df1, df2)
setDT(Res)[duplicated(Res, by = c("a", "b"), fromLast = TRUE)]
#    a b   c
# 1: 1 m df1
# 2: 3 f df1

Edit2:我看到@CathG 开启了加入前线,下面是我们使用data.table 的方法

setkey(setDT(df1), a, b) ; setkey(setDT(df2), a, b)
df1[df2, nomatch = 0]
#    a b   c i.c
# 1: 1 m df1 df2
# 2: 3 f df1 df2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 2016-08-08
    • 2017-05-12
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多