来自书中的P146示例" R in action"

时间:2016-08-23 19:27:35

标签: r

来自书" R in action"第146页它有一个由

组成的描述性统计数据的例子
vars <- c("mpg", "hp", "wt")
...
> dstats <- function(x)(c(mean=mean(x), sd=sd(x)))
> by(mtcars[vars], mtcars$am, dstats)

但是当我把它输入到R中时我得到的是

> Error in is.data.frame(x) : 
>(list) object cannot be coerced to type 'double'
>In addition: Warning message:
>In mean.default(x) : argument is not numeric or logical: returning NA

我不知道这里发生了什么。任何人都可以给我一个帮助。感谢。

1 个答案:

答案 0 :(得分:0)

请在R控制台中执行?by()

在帮助中,您会找到FUN

的以下内容
by(data, INDICES, FUN, ..., simplify = TRUE)

FUN a function to be applied to (usually data-frame) subsets of data.

<强>更新

这可能更多地与定义mean()和sd()的方式有关。它们都支持向量,而不是数据帧。

查看下面的示例,看看mean()带有和不带Vectorize()的差异:

x <- data.frame( a = c(1, 2, 4), b = c(1, 2, 4))

现在,如果你这样做:

by(x, 1:3, mean)

您将收到以下错误:

Warning messages:
1: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA
2: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA
3: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA

但是在添加Vectorize()时:

by(x, 1:3, Vectorize(mean))
1:3: 1
a b 
1 1 
------------------------------------------------------- 
1:3: 2
a b 
2 2 
------------------------------------------------------- 
1:3: 3
a b 
4 4 

同样来自论坛:

  

by(as.data.frame(mtcars [vars]),mtcars $ am,dstats)

     

问题在于by功能。如果用平均值替换dstats   或者SD,它仍然不起作用。它只适用于摘要   功能。我想知道作者如何得到书中的输出?

来源:https://forums.manning.com/posts/list/32059.page