R:为dplyr选择每两个连续的行

时间:2015-01-15 10:05:38

标签: r statistics plyr apply linear-regression

这是我的数据

 Assay Sample Dilution  meanresp number
    1    S     0.25       68.55      1
    1    S     0.50       54.35      2
    1    S     1.00       44.75      3

我的最终目标是对每两个连续行应用线性回归,并使用Dilution和meanresp返回该回归的斜率。

桌子的长度可能会有所不同,我宁愿不使用for循环,因为我试图摆脱这种习惯。

我认为ddply会很好,但我不确定如何选择每两个连续行的子集。我想也许有一种方法可以说'为长度为2的稀释的每个向量子集做这个吗?

任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:3)

我不知道这对线性回归有什么帮助,但你可以这样做:

df <- read.table(header=T, text="Assay Sample Dilution  meanresp number
    1    S     0.25       68.55      1
    1    S     0.50       54.35      2
    1    S     1.00       44.75      3")

使用lapply

> lapply(2:nrow(df), function(x) df[(x-1):x,] )
[[1]]
  Assay Sample Dilution meanresp number
1     1      S     0.25    68.55      1
2     1      S     0.50    54.35      2

[[2]]
  Assay Sample Dilution meanresp number
2     1      S      0.5    54.35      2
3     1      S      1.0    44.75      3

如果您想要连续行的特定列,可以选择它们:

> lapply(2:nrow(df), function(x) df[(x-1):x, c('Dilution','meanresp')] )
[[1]]
  Dilution meanresp
1     0.25    68.55
2     0.50    54.35

[[2]]
  Dilution meanresp
2      0.5    54.35
3      1.0    44.75

修改

如果您想执行线性回归,则另一个lapply足以执行此操作:

a <- lapply(2:nrow(df), function(x) df[(x-1):x, c('Dilution','meanresp')] )

b <- lapply(a,function(x) lm(Dilution~meanresp,data=x))

>b
[[1]]

Call:
lm(formula = Dilution ~ meanresp, data = x)

Coefficients:
(Intercept)     meanresp  
    1.45687     -0.01761  


[[2]]

Call:
lm(formula = Dilution ~ meanresp, data = x)

Coefficients:
(Intercept)     meanresp  
    3.33073     -0.05208  

或者如果你只想要斜率:

b <- lapply(a, function(x) {
                    d <- lm(Dilution~meanresp,data=x)
                    coefficients(summary(d))[2,1]
})

> b
[[1]]
[1] -0.01760563

[[2]]
[1] -0.05208333