首页 > 解决方案 > 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 的解决方案都有效。谢谢!

标签: rdplyrrename

解决方案


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))

这会给你同样的结果。


推荐阅读