• R语言
  • 我竟然可以将数据框的列名保持一样

客官可以执行如下代码,观察结果

do.call("cbind", lapply(split(PlantGrowth, f = PlantGrowth$group), subset, select = "weight"))
#>    weight weight weight
#> 1    4.17   4.81   6.31
#> 2    5.58   4.17   5.12
#> 3    5.18   4.41   5.54
#> 4    6.11   3.59   5.50
#> 5    4.50   5.87   5.37
#> 6    4.61   3.83   5.29
#> 7    5.17   6.03   4.92
#> 8    4.53   4.89   6.15
#> 9    5.33   4.32   5.80
#> 10   5.14   4.69   5.26

<sup>Created on 2019-12-12 by the reprex package (v0.3.0)</sup>

如果把上面的结果保存为 dat,则 class(dat) 返回 data.frame,而查看帮助 ?data.frame 可以看到,数据框的列名要保持唯一的,我是不是发现了什么冲突的地方?

    Cloud2016

    df=mtcars[1:2,1:2]
    
    df
    #>               mpg cyl
    #> Mazda RX4      21   6
    #> Mazda RX4 Wag  21   6
    
    names(df) = c("a","a")
    
    df
    #>                a a
    #> Mazda RX4     21 6
    #> Mazda RX4 Wag 21 6
    
    df$a
    #> [1] 21 21
    
    library(tibble)
    
    as.tibble(df)
    #> Warning: `as.tibble()` is deprecated, use `as_tibble()` (but mind the new semantics).
    #> This warning is displayed once per session.
    #> Error: Column name `a` must not be duplicated.

    <sup>Created on 2019-12-12 by the reprex package (v0.3.0)</sup>

      Cloud2016 data.frame 里有个 check.names 参数,默认为 T,保证了列名不重复;若是有重复的,就自动重命名为 w, w1, w2...。如果这个参数被设为 Fdata.frame则不会检查列名是否重复。但是在 as.data.frame没有这个参数,cbind 里这个参数默认为 F。你可以对比一下 data.frame(df)data.frame(df, check.names == F)看了眼帮助,这一段里面介绍得比较清楚,你应该已经知道了。

      cbind 里发现这个:

      The cbind data frame method is just a wrapper for data.frame(..., check.names = FALSE).

      tctcab 就是说列名重复在 data.frame 里允许了,但是在 tibble 里不允许,检查更加严格

        getAnywhere(cbind.data.frame)
        A single object matching ‘cbind.data.frame’ was found
        It was found in the following places
          package:base
          registered S3 method for cbind from namespace base
          namespace:base
        with value
        
        function (..., deparse.level = 1) 
        data.frame(..., check.names = FALSE)
        <bytecode: 0x000000002e614a58>
        <environment: namespace:base>