В R объект встречи со списком проблем не может быть приведен к типу double при использовании функции by - PullRequest
1 голос
/ 29 февраля 2020

Я пытался использовать by, чтобы получить среднее значение и sd для данных

вот мой код

dstats <- function(x)(c(mean=mean(x),sd=sd(x)))

aggregate(mtcars[vars],by=list(am=mtcars$am), FUN = dstats) 

Это прекрасно работает, я получил

 am  mpg.mean    mpg.sd   hp.mean     hp.sd   wt.mean     wt.sd
1  0 17.147368  3.833966 160.26316  53.90820 3.7688947 0.7774001
2  1 24.392308  6.166504 126.84615  84.06232 2.4110000 0.6169816

Чтобы получить аккуратную диаграмму, я хочу разделить на mtcars$am, я попытался


by(mtcars[vars],mtcars$am, FUN=dstats)

Затем я встретил

Error during wrapup: 'list' object cannot be coerced to type 'double'

Я не думаю, что число является data.frame символьным, потому что я могу правильно использовать aggregate. Интересно, в чем ошибка? Благодаря.

1 Ответ

0 голосов
/ 29 февраля 2020

by работает с data.frame, который разделен на mtcars$am, поэтому ваша функция должна работать с data.frame вместо вектора, поэтому в примере ниже я использую sapply для go через каждый столбец и вычислите среднее значение и сд:

by(mtcars[vars],mtcars$am, FUN = function(u)sapply(u,dstats)) 
mtcars$am: 0
           mpg       hp        wt
mean 17.147368 160.2632 3.7688947
sd    3.833966  53.9082 0.7774001
------------------------------------------------------------ 
mtcars$am: 1
           mpg        hp        wt
mean 24.392308 126.84615 2.4110000
sd    6.166504  84.06232 0.6169816

Не так просто вернуть тот же формат, что и ваш вывод для агрегата, который является вложенным data.frame:

res = aggregate(mtcars[vars],by=list(am=mtcars$am), FUN = dstats)
class(res$hp)
[1] "matrix"
# to get mean hp for different groups, you have to do:
res$hp[,"mean"]
[1] 160.2632 126.8462

Чтобы получить нечто подобное с, это немного сложнее:

res = do.call(rbind,
by(mtcars[vars],mtcars$am,function(i){
unlist(lapply(i,dstats))
})
)
res = data.frame(am=levels(factor(mtcars$am)),res)

  am mpg.mean   mpg.sd  hp.mean    hp.sd  wt.mean     wt.sd
0  0 17.14737 3.833966 160.2632 53.90820 3.768895 0.7774001
1  1 24.39231 6.166504 126.8462 84.06232 2.411000 0.6169816
...