2014-02-17 99 views
3

我有df有12列:我怎樣才能做到這一點與dplyr包

df<-read.table(header=T,text="V1 V2  V3   V4    V5 V6 V7  V8  V9 V10 V11 V12 
A01 10378809 10379882 Contig1401|m.3412 101 - 10378809 10379882 255,0,0 1 1073 0 
A01 10469105 10469293 Contig1755|m.4465 48 + 10469105 10469293 255,0,0 2 188 0 
A01 10469429 10469630 Contig1755|m.4465 5 + 10469429 10469630 255,0,0 NA 201 0") 

首先,我想通過重疊羣組他們,然後生成12列下面的值。我想通過dplyr做到這一點,但我有一些錯誤。

as.data.frame(df %.% group_by(V4) %.% summarise(V12=apply(df[2], 2, function(x)x-x[1]))) 

錯誤:

Error in summarise_impl(.data, named_dots(...), environment()) : attempt to use zero-length variable name

對於每個組我想從第二列的第一個值中減去第二個值。如果只有2行(max-min),我可以很容易地做到這一點,但如果超過2行,我會錯過中間行。

所以我想我會寫一個函數並插入到dplyr,但似乎我不能使用我自己的函數dplyr

下面是最終輸出我需要:

V1  V2  V3    V4 V5 V6  V7  V8  V9 V10 V11 V12 
1 A01 10378809 10379882 Contig1401|m.3412 101 - 10378809 10379882 255,0,0 1 1073 0 
2 A01 10469105 10469293 Contig1755|m.4465 48 + 10469105 10469293 255,0,0 2 188 0 
3 A01 10469429 10469630 Contig1755|m.4465 5 + 10469429 10469630 255,0,0 NA 201 324 
+0

在代碼中,你從所有值減去第一個值,不僅從第二。你的例子的預期結果是什麼? –

+0

可能是我錯了。但我想減去每個唯一V4列的第一個值的第二個值。如果有兩個,我可以很容易地做到這一點,但如果有多個,我可以做到這一點。我編輯了我的問題以包括預期的輸出。謝謝 – upendra

回答

5

我想你正在尋找這樣的:

library(dplyr) 
df %.% 
    group_by(V4) %.% 
    mutate(V12 = V2 - V2[1]) 
+0

謝謝。有效。輕鬆解決dplyr問題。謝謝 Upendra – upendra

+0

我的不好。完成...... – upendra

+3

你也可以使用'first(V2)'。這裏沒有優勢,但在其他情況下,定義「第一個」的含義可能很有用 – hadley

相關問題