2014-09-23 47 views
0

我有一个data.frame df 5列和10000行左右。连续行不同列中值的差异

我尝试。减去对于每对连续行 第2列的行的值(i + 1) 从塔3的行中的值(1) 并将结果写入在一个称为新列'差异”

df的样子:

` chr start  end TBX21 width 
1 chr1 4847746 4847778 53.37334 32 
2 chr1 6204636 6204673 33.70947 37  
3 chr1 6457267 6457345 31.83673 78 

`

我想: `

length = length(df[[1]])-1 

for (i in 1:length) { 
    df$diff = df[i+1, 2] - df[i,3]; 
} 

` 和我所得到的是:

`chr start  end TBX21 width diff 
1 chr1 4847746 4847778 53.37334 32  9229 
2 chr1 6204636 6204673 33.70947 37  9229 
3 chr1 6457267 6457345 31.83673 78  9229 
4 chr1 7078778 7078822 39.32772 44  9229` 

我不能figuere了我的错误。 是的我是一个初学者在R

+0

改为使用函数'diff()'。 – Andrie 2014-09-23 14:54:07

+0

我认为diff()只给出了一列内连续行的差异。你能告诉我怎么样? – pidoretroma 2014-09-23 14:55:10

+1

问题是你一次把所有的行分配给不同的行,因为你忘了索引你'diff'变量。把'df $ diff'替换为'df $ diff [i]',它应该可以工作 – Bernardo 2014-09-23 14:58:34

回答

2

你可以以矢量化的方式实现这一点,即不使用显式循环。

例如:

dat$diff <- c(NA, tail(dat$end, -1) - head(dat$start, -1)) 
dat 

    chr start  end TBX21 width diff 
1 chr1 4847746 4847778 53.37334 32  NA 
2 chr1 6204636 6204673 33.70947 37 1356927 
3 chr1 6457267 6457345 31.83673 78 252709 

在话:滴的end第一个元素和的start最后一个元素,然后取矢量差。

1

问题是你一次分配差异到所有行,因为你忘记索引你的差异变量以及。

替换df$diffdf$diff[i],它应该工作。

但是,R中的显式循环并不总是最好的选择,特别是对于大型数据集。 @ Andrie的回答在向量化方法中很好地覆盖了它。如果你有一个小/中等大小的数据集,我会保持简单,因为它更易于阅读。