r - Dplyr:使用 rename() 重命名 tibble 中添加的列未按预期工作
问题描述
因此,我正在尝试重命名在我的 R 代码中显示摘要统计信息的小标题的列。但是对于我添加到 tibble 的列,我似乎无法完全更改它们的名称
这是从数据框“UScereal”中获取中值最小值和最大值的代码:
UScereal %>% #get median
group_by(mfr) %>%
summarise(fibre = median(fibre)) -> fib_med
UScereal %>% #get maximum
group_by(mfr) %>%
summarise(fibre = max(fibre)) -> maximum
maximum %>% select(max = fibre) -> maximum #remove first column and rename 2nd column as 'max'
UScereal %>%
group_by(mfr) %>% #get minimum
summarise(fibre = min(fibre)) -> minimum
minimum %>% select(min = fibre) -> minimum #remove first column and rename 2nd column as 'min'
fib_med <- add_column(fib_med, maximum, minimum) #append the max and min to the first tible
这些是我尝试重命名列的两种不同的语句:
fib_med <- fib_med %>% rename(fib_med, manufacturer = mfr, median_fiber = fibre, max_fiber = maximum$max, fiber_minimum = minimum$min)
#throws Error: All arguments must be named
fib_med <- fib_med %>% rename(manufacturer = mfr, median = fibre) #works fine
fib_med
我注意到,当我打电话时,colnames(fib_med)
我得到了想要的结果
> colnames(fib_med)
[1] "manufacturer" "median" "maximum" "minimum"
但是当我打印/查看表格时,我得到的是“maximum$max”而不是“maximum”,最小值也一样
> fib_med
# A tibble: 6 x 4
manufacturer median maximum$max minimum$min
<fct> <dbl> <dbl> <dbl>
1 G 1.8 5 0
2 K 1.33 28 0
3 N 5.97 30.3 4.48
4 P 7.46 12 0
5 Q 1 4 0
6 R 1.33 5.97 0
是否因为我从另一个小标题添加了最大和最小列而显得古怪?有没有办法修复它,所以列名是:“制造商”、“中位数”、“最大值”、“最小值”?
编辑:解决了。akrun 和 iod 的解决方案都有效。谢谢!
解决方案
fib_med <- fib_med %>% rename(fib_med, manufacturer = mfr, median_fiber = fibre, max_fiber = maximum$max, fiber_minimum = minimum$min)
#throws Error: All arguments must be named
这个不起作用,因为重命名中的第一个参数是数据集,但您已经使用了%>%
,它将运算符的左侧作为 RHS 的第一个参数。
您可以通过仅对您想要的列进行子集化而不是使用来解决最大$max 和 minimum$min 问题select
:
maximum$fibre -> maximum
最低限度也是如此。现在你不会有问题了。
换句话说:
UScereal %>% #get median
group_by(mfr) %>%
summarise(fibre = median(fibre)) -> fib_med
UScereal %>% #get maximum
group_by(mfr) %>%
summarise(fibre = max(fibre)) -> maximum
maximum$fibre -> maximum #remove first column and rename 2nd column as 'max'
UScereal %>%
group_by(mfr) %>% #get minimum
summarise(fibre = min(fibre)) -> minimum
minimum$fibre -> minimum #remove first column and rename 2nd column as 'min'
fib_med <- tibble::add_column(fib_med, maximum, minimum)
fib_med
# A tibble: 6 x 4
mfr fibre maximum minimum
<fct> <dbl> <dbl> <dbl>
1 G 1.8 5 0
2 K 1.33 28 0
3 N 5.97 30.3 4.48
4 P 7.46 12 0
5 Q 1 4 0
6 R 1.33 5.97 0
虽然,坦率地说,这是一种非常迂回的方式。
这样做要简单得多:
fib_med<-UScereal %>% group_by(mfr) %>%
summarize(median=median(fibre),
maximum=max(fibre),
mininum=min(fibre))
这会给你同样的结果。
推荐阅读
- visual-studio - 我将如何创建一个 Visual Studio 外部工具来运行“将项目添加到文件夹...”TFS 命令?
- ruby - 描述我的 ruby 应用程序(linux)的配置文件路径的标准方法是什么?
- javascript - 如何使用 javascript 从长列表中复制项目
- amazon-web-services - AWS lambda 顺序调用相同的函数
- node.js - Cloudinary图像上传返回缓冲区而不是url?
- node.js - Express+Nodejs 与使用 Firebase 的客户端之间的用户会话
- jquery - 用于根据日期时间值启用按钮的 Jquery 函数
- java - Selenium Web 驱动程序和 geckodriver (Java) 的疯狂日志垃圾邮件错误
- java - Reactor Mono/Flux - 遍历数组并按条件返回结果
- sql-server - Linux 服务器上的“在 Kerberos 数据库中找不到服务器”错误?