-1

我有一个如下的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。任何人都可以指出我做错了什么。

谢谢乌彭德拉

4

3 回答 3

1

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

我为演示设置了两个 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
于 2014-04-10T00:10:30.313 回答
0

我猜 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,]
于 2014-04-10T06:54:47.940 回答
-1

也许您可以使用以下内容:

test[test$V8==max(test$V8),]
于 2014-04-10T06:29:38.563 回答