使用dplyr按行位置引用值

3

我有一个包含12列的df

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")

首先,我想按contig将它们分组,然后为第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

对于每个组,我想要从第二列的第一个值中减去第二列的第二个值。如果只有两行则很容易实现这个功能(最大值-最小值),但是如果超过两行时,我将会忽略了中间的行。

所以我想编写一个函数并将其插入到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

在你的代码中,你从所有值中减去第一个值,而不仅仅是第二个值。你的示例预期结果是什么? - Sven Hohenstein
也许我错了,但我想从每个唯一的V4列中减去第二个值和第一个值。如果只有两个值,我可以轻松地完成这个任务,但如果有多个值,我就做不到了。我编辑了我的问题以包括预期的输出。谢谢。 - upendra
1个回答

5
我想你可能正在寻找这个:

我猜你是在寻找这个:

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

谢谢。它有效了。使用dplyr轻松解决了问题。感谢。 Upendra - upendra
3
你还可以使用 first(V2)。这里没有优势,但在其他情况下,定义你所指的“第一个”可能很有用。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接