如何根据特定列或组过滤数据框?

时间:2014-04-09 23:44:10

标签: r filter dplyr

我有一个如下的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。任何人都能指出我在哪里做错了。

由于 众议员

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,]

答案 2 :(得分:-1)

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

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