我也遇到了,仔细调试后发现by函数不能将数据框按照各列变量的顺序传送给dstats函数,结果dstats函数接受的是整个数据框3个变量一起算均数而报错,相反使用aggregate函数确没问题。估计是书作者版本和我们用的不同的原因,谁知道呢
> by(tt1[var],tt1[,1],dstats)
Error in is.data.frame(x) : (串列)对象不能强制改变成'double'种类
此外: Warning messages:
1: In mean.default(x) : 参数不是数值也不是逻辑值:回覆NA
2: In mean.default(x) : 参数不是数值也不是逻辑值:回覆NA
3: In mean.default(x) : 参数不是数值也不是逻辑值:回覆NA
> aggregate(tt1[var],by=list(sex=tt1[,2]),dstats)
sex 年龄.mean 年龄.sd 空腹血糖.mean 空腹血糖.sd
1 男 64.333333 10.481730 6.8833333 1.6129683
2 女 54.000000 2.309401 5.5000000 0.5773503
> by(tt1[,4],tt1[,2],dstats)
tt1[, 2]: 男
mean sd
6.883333 1.612968
------------------------------------------------------------------------------------------------------------------
tt1[, 2]: 女
mean sd
5.5000000 0.5773503
> aggregate(tt1[4],by=list(sex=tt1[,2]),dstats)
sex 空腹血糖.mean 空腹血糖.sd
1 男 6.8833333 1.6129683
2 女 5.5000000 0.5773503
> by(tt1[,3:4],tt1[,2],dstats)
Error in is.data.frame(x) : (串列)对象不能强制改变成'double'种类
此外: Warning message:
In mean.default(x) : 参数不是数值也不是逻辑值:回覆NA
我用的试验数据> tt1
病历号 性别 年龄 空腹血糖
1 1 男 52 8.0
2 2 男 51 7.0
3 3 女 52 5.0
8 3 女 52 5.0
4 4 女 56 6.0
9 4 女 56 6.0
5 5 男 74 5.0
10 5 男 74 5.0
6 6 男 65 9.0
7 7 男 70 7.3
> str(tt1)
'data.frame': 10 obs. of 4 variables:
$ 病历号 : chr "1" "2" "3" "3" ...
$ 性别 : Factor w/ 2 levels "男","女": 1 1 2 2 2 2 1 1 1 1
$ 年龄 : num 52 51 52 52 56 56 74 74 65 70
$ 空腹血糖: num 8 7 5 5 6 6 5 5 9 7.3
> var
[1] "年龄" "空腹血糖"
我们版本 aggregate函数功能和作者的相比正好加强了,可以返回成组变量,by似乎能力变弱了达不到作者说的要求


雷达卡


京公网安备 11010802022788号







