use*_*509 5 aggregate r dataframe
我使用聚合函数来获得因子级别的范围.我正在尝试重命名列,但聚合函数的输出没有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))
Run Code Online (Sandbox Code Playgroud)
输出:
spcode_range
Group.1 x.1 x.2
1 200 45 89
2 400 23 52
3 401 56 85
Run Code Online (Sandbox Code Playgroud)
数据结构:
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
Run Code Online (Sandbox Code Playgroud)
输出具有三列:Group.1,x.1(分钟)和x.2(最大值),但数据帧仅具有2列.我已经尝试了setNames,重命名和名称没有成功,因为我试图在R只有2列时命名三列.
基本上,这里发生的事情是您按range组调用了一次返回两个值的函数。该aggregate函数返回 a data.frame(除非数据集是一个ts类,否则它总是这样做),并将这些值作为 amatrix放在单个列中(matrix显然是类)。
然后,当您print这样做时,它会触发该print.data.frame方法,该方法依次调用format.data.frame将矩阵列中的每一列转换为单独的列(请参阅str(format.data.frame(spcode_range))),然后,打印的结果实际上不是data.frame您尝试打印的实际结果(不要问我为什么,可能是为了方便 - 因为不清楚如何matrix在 a 中打印 a 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
Run Code Online (Sandbox Code Playgroud)
或者只是使用其他包,例如dplyr或data.table那些旨在(除其他外)替换/改进 R 中的数据操作操作的包。
| 归档时间: |
|
| 查看次数: |
2512 次 |
| 最近记录: |