2014-02-17 78 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

相关问题