R: Избиране на всеки два последователни реда за ddplyr

Това са моите данни

 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

Крайната ми цел е да прилагам линейна регресия към всеки два последователни реда и да връщам наклона на тази регресия с помощта на Разреждане и средна стойност.

Дължината на масата може да варира и бих предпочел да не използвам for loops, тъй като се опитвам да се отърва от навика.

Мисля, че ddply би бил добър, но не съм сигурен как да избирам подмножеството на всеки два последователни реда. Мислех, че може би може да има начин да се каже „направете това за всяко векторно подмножество на Разреждане с дължина 2?“

Всяко прозрение би било полезно.


person Kabau    schedule 15.01.2015    source източник
comment
Не съм сигурен какво очаквате като резултат. Нещо като diff(meanresp) / diff(Dilution) (групирани по Assay и Sample)?   -  person Roland    schedule 15.01.2015
comment
може това помага ли ви? (за избор на всеки два последователни реда)   -  person Cath    schedule 15.01.2015
comment
Стремя се към нещо, което прави това: ddply(.data=data, .variables='subsets every consecutive 2 rows', .fun='linear model function') Поднастройката е мястото, където имам проблеми. Това има ли смисъл?   -  person Kabau    schedule 15.01.2015
comment
ddply се разделя по колони, а не по редове, така че не можете да го използвате. Вижте начин да го направите, като използвате lapply два пъти по-долу. По същество можете да обедините тези две като 1 функция, но аз бих го избегнал, тъй като причинява труден за четене код.   -  person LyzandeR    schedule 15.01.2015


Отговори (1)


Не знам как това ще бъде полезно при линейна регресия, но можете да направите нещо подобно:

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
person LyzandeR    schedule 15.01.2015
comment
Това е страхотно, благодаря. Той прави почти точно това, от което се нуждая (просто ще трябва да направя списъка да стане рамка с данни, вместо да показва какви разреждания са използвани). - person Kabau; 15.01.2015