我有一个如下的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。任何人都能指出我在哪里做错了。
由于 众议员
答案 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),]