我使用聚合函数来获得因子级别的范围.我正在尝试重命名列,但聚合函数的输出没有min和max作为单独的列.
# example data size_cor <- data.frame(SpCode = rep(c(200,400,401),3),Length = c(45,23,56,89,52,85,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中的数据操作操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。