【问题标题】:Filter columns of a df using other df使用其他 df 过滤 df 的列
【发布时间】:2020-10-28 19:13:41
【问题描述】:

我有 2 个数据框(我们称之为 A 和 B)。 在A中,我有这样的结构:

在 B 中,像这样:

我要做的是过滤与 B 匹配的 A 的列名。但我想保留第一列。

这样做我得到了我想要的,但我丢失了 Hugo_Symbol 列:

Data_filter <- A[ ,which((names(A) %in% B$SAMPLE_ID)==TRUE)]

欢迎任何帮助!谢谢!

【问题讨论】:

  • 试试df1[names(df1) %in% c(df2$SAMPLE_ID, "Hugo_Symbol")]。也请不要分享数据图像。使用dput() 提供可重现的示例
  • 试试:A[c(TRUE, names(A)[-1] %in% unique(B$SAMPLE_ID))]
  • 感谢你们的快速回复!抱歉@Sotos,我认为我的代码中只缺少一件事,我发现没有必要,但你是对的,我应该放一个可重现的例子

标签: r dataframe subset


【解决方案1】:

还可以制作和“排除列表”数据框,然后使用 anti_join。如果您想根据多个条件删除,这是可能的。

测试/伪数据:

ID1 <- c(5,10,6)
ID2 <- c(3,5,4)
Value <- rnorm(3)
DF1 <- data.frame(ID1, ID2, Value)

x <- c()
y <- c()
z <- c()

for (i in 1:10){
a <- rep(i, 10)
b <- c(1:10)
c <- rnorm(10)
x <- c(x, a)
y <- c(y, b)
z <- c(z, c)
}

DF2 <- data.frame(x, y, z)

制作一个“排除”列表

excl <- data.frame(
  x = c(DF1$ID1, DF1$ID2),
  y = c(DF1$ID2, DF1$ID1))

然后使用反连接:

library(dplyr)
anti_join(DF2, excl, by = c("x", "y"))

【讨论】:

    【解决方案2】:

    只是,添加列名:

    Data_filter <- A[ , names(A) %in% c(B$SAMPLE_ID, "Hugo_Symbol")]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-23
      • 2021-09-07
      • 2022-11-04
      • 2019-04-26
      • 2019-07-26
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多