【问题标题】:Dplyr: Renaming added columns in a tibble with rename() not working as intendedDplyr:使用 rename() 重命名 tibble 中添加的列未按预期工作
【发布时间】:2020-02-02 01:21:11
【问题描述】:

所以我正在尝试重命名在我的 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 的解决方案都有效。谢谢!

【问题讨论】:

    标签: r dplyr rename


    【解决方案1】:

    数据集不是常规数据集。如果我们检查str(fib_med),它表明这些列实际上是data.frame,只有一列

    fib_med <- do.call(data.frame, fib_med)
    

    现在是最后一步

    fib_med <- fib_med %>%
        rename(manufacturer = mfr, median = fibre) 
    fib_med
    #  manufacturer   median       max      min
    #1            G 1.800000  5.000000 0.000000
    #2            K 1.333333 28.000000 0.000000
    #3            N 5.970149 30.303030 4.477612
    #4            P 7.462687 12.000000 0.000000
    #5            Q 1.000000  4.000000 0.000000
    #6            R 1.333333  5.970149 0.000000
    

    【讨论】:

      【解决方案2】:
      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
      

      这个不起作用,因为您重命名的第一个参数是数据集,但您已经使用了%&gt;%,它将运算符的左侧作为 RHS 的第一个参数。

      您可以解决最大$max 和最小$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))
      

      这会给你同样的结果。

      【讨论】:

        猜你喜欢
        • 2018-05-29
        • 1970-01-01
        • 2014-12-24
        • 2019-05-07
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 2012-02-10
        • 2011-01-25
        相关资源
        最近更新 更多