当前位置 : 主页 > 手机开发 > 其它 >

聚合打印不正确的列数

来源:互联网 收集:自由互联 发布时间:2021-06-22
我使用聚合函数来获得因子级别的范围.我正在尝试重命名列,但聚合函数的输出没有min和max作为单独的列. # example datasize_cor - data.frame(SpCode = rep(c(200, 400, 401), 3), Length = c(45, 23, 56, 89, 52,
我使用聚合函数来获得因子级别的范围.我正在尝试重命名列,但聚合函数的输出没有min和max作为单独的列.

# example data
size_cor <- data.frame(SpCode = rep(c(200, 400, 401), 3),
                       Length = c(45, 23, 56, 89, 52, 85, 56, 45, 78))

# aggregate function
spcode_range <- with(size_cor, aggregate(Length, list(SpCode), FUN = range))

输出:

spcode_range 

  Group.1 x.1 x.2
1     200  45  89
2     400  23  52
3     401  56  85

数据结构:

str(spcode_range)

'data.frame':   3 obs. of  2 variables:
 $Group.1: num  200 400 401
 $x      : num [1:3, 1:2] 45 23 56 89 52 85

dim(spcode_range)
[1] 3 2

输出有三列:Group.1,x.1(min)和x.2(max),但数据帧只有2列.我已经尝试了setNames,重命名和名称没有成功,因为我试图在R只有2列时命名三列.

基本上这里发生的是你按组调用范围函数,它一次返回两个值.聚合函数返回一个data.frame(除非数据集是ts类,它总是这样做),这些值作为单个列中的矩阵(显然是类矩阵).

然后,当你打印它时,它会触发print.data.frame方法,该方法又调用format.data.frame,它将矩阵列中的每一列转换为一个单独的列(参见str(format.data.frame(spcode_range)) )然后,打印结果实际上不是您要打印的实际data.frame(不要问我原因,可能是为了方便 – 因为不清楚如何在data.frame中打印矩阵).

所以基本上,解决这个问题的一种方法是结合do.call和cbind.data.frame,例如

res <- do.call(cbind.data.frame, aggregate(Length ~ SpCode, size_cor, range))
str(res)
# 'data.frame': 3 obs. of  3 variables:
# $SpCode  : num  200 400 401
# $Length.1: num  45 23 56
# $Length.2: num  89 52 85

或者只使用其他软件包,例如dplyr或data.table,这些软件包被设计用于(在其他方面)替换/改进R中的数据操作操作.

网友评论