【问题标题】:How to filter the dataframe based on a particular column or group? [duplicate]如何根据特定列或组过滤数据框? [复制]
【发布时间】:2014-05-23 10:46:02
【问题描述】:

我有一个如下的df...

         V1          V2   V3      V4    V5   V6   V7    V8
m.Bra004793   Bra004793  887  887.00 21.74 0.45 0.29 16.40
m.Bra004793.1 Bra004793  907  907.00 20.52 0.42 0.27 15.11
m.Bra004793.2 Bra004793 1006 1006.00 16.39 0.30 0.19 10.81
m.Bra004793.3 Bra004793  988  988.00 56.56 1.05 0.67 38.02
m.Bra004793.4 Bra004793 1097 1097.00 32.69 0.54 0.35 19.67

对于每个唯一 ID(例如 Bra004793),我想通过选择最大 V8 来选择最佳 V1。例如在这种情况下,我想获得以下 id

m.Bra004793.3 Bra004793  988  988.00 56.56 1.05 0.67 38.02

但不幸的是,我正在尝试的 dplyr 包不起作用。这是我迄今为止尝试过的..

        test <- read.table("test_PASA_isoform.csv", sep = ",", h = T)
        head(test)
        data.filetered <- as.data.frame(test %.% group_by(V2) %.% summarise(V8 = max(V8)))
        head(data.filetered)
         V2          V1    V8
1 Bra004793 m.Bra004793 38.02

在这里您可以看到,即使我得到了正确的结果,我也没有得到正确的 V1 id。谁能指出我哪里做错了。

谢谢 乌彭德拉

【问题讨论】:

  • 也许:test %.% group_by(V2) %.% filter( V8 == max(V8) ) ?
  • 很好用。我不知道 dplyr 包中的过滤器功能。谢谢.....

标签: r filter dplyr


【解决方案1】:

不是dplyr包的解决方案,但是通过shell命令awk更容易

我为demo设置了两个ID。

cat file
         V1        V2   V3      V4    V5   V6   V7    V8
   m.Bra004793 Bra004793  887  887.00 21.74 0.45 0.29 16.40
 m.Bra004793.1 Bra004794  907  907.00 20.52 0.42 0.27 15.11
 m.Bra004793.2 Bra004793 1006 1006.00 16.39 0.30 0.19 10.81
 m.Bra004793.3 Bra004794  988  988.00 56.56 1.05 0.67 38.02
 m.Bra004793.4 Bra004793 1097 1097.00 32.69 0.54 0.35 19.67

这里是 awk 命令:

awk '{if (max[$2]<$8){max[$2]=$8;l[$2]=$0}}END{for (i in max) print l[i]}' file

         V1        V2   V3      V4    V5   V6   V7    V8
 m.Bra004793.4 Bra004793 1097 1097.00 32.69 0.54 0.35 19.67
 m.Bra004793.3 Bra004794  988  988.00 56.56 1.05 0.67 38.02

【讨论】:

  • 它工作得很好,但仍然想知道为什么这里的 dplyr 命令不起作用。无论如何感谢您的帮助。
【解决方案2】:

我猜 V2 是您的唯一 ID,否则将没有最大值可供选择 [V1 中的每一行都是唯一的]。在这种情况下,data.table 解决方案是:

library(data.table)
df = data.table(read.table(header = T, text = "
V1          V2   V3      V4    V5   V6   V7    V8
m.Bra004793   Bra004793  887  887.00 21.74 0.45 0.29 16.40
m.Bra004793.1 Bra004793  907  907.00 20.52 0.42 0.27 15.11
m.Bra004793.2 Bra004793 1006 1006.00 16.39 0.30 0.19 10.81
m.Bra004793.3 Bra004793  988  988.00 56.56 1.05 0.67 38.02
m.Bra004793.4 Bra004793 1097 1097.00 32.69 0.54 0.35 19.67
"))

df[,best := max(V8), by = V2]
df[V8 == best,]

【讨论】:

    【解决方案3】:

    也许你可以使用类似下面的东西:

    test[test$V8==max(test$V8),]
    

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 2022-01-23
      • 2013-11-10
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2020-03-06
      • 2019-08-27
      相关资源
      最近更新 更多