函数 transform 会将原来的列名做转换,而我希望最终不要转换

dat <- data.frame(
  `你好(公斤/天)` = rep(c(1, 2, 3), each = 3),
  `日期` = rep(c("2019-12-12", "2019-12-13", "2019-12-14"), each = 3),
  check.names = FALSE
)

dat
 你好(公斤/天)       日期
1               1 2019-12-12
2               1 2019-12-12
3               1 2019-12-12
4               2 2019-12-13
5               2 2019-12-13
6               2 2019-12-13
7               3 2019-12-14
8               3 2019-12-14
9               3 2019-12-14
transform(dat, `哈哈` = `你好(公斤/天)` * 3)
 你好.公斤.天.       日期 哈哈
1             1 2019-12-12    3
2             1 2019-12-12    3
3             1 2019-12-12    3
4             2 2019-12-13    6
5             2 2019-12-13    6
6             2 2019-12-13    6
7             3 2019-12-14    9
8             3 2019-12-14    9
9             3 2019-12-14    9

你好(公斤/天) 变成了 你好.公斤.天.,不知道这是一个 feature 还是一个 bug?

    Cloud2016 看源代码:transform.default,再看 ?data.framecheck.names 参数。我看这个默认值的坑跟 stringsAsFactors 的坑也差不多大小了,都是尝试着聪明,但更多时候是让用户迷惑不解。stringsAsFactors 尚有法改变其默认值,而 transform() 函数则无法传递 check.namesdata.frame()

    其实 transform() 如果换做调用 as.data.frame() 而不是 data.frame() 的话,也就不会存在这个问题了。

      yihui 在这里,还是 data.table 好!

      library(data.table)
      setDT(dat)
      dat[, `哈哈` := `你好(公斤/天)` * 3]
      dat
         你好(公斤/天)       日期 哈哈
      1:               1 2019-12-12    3
      2:               1 2019-12-12    3
      3:               1 2019-12-12    3
      4:               2 2019-12-13    6
      5:               2 2019-12-13    6
      6:               2 2019-12-13    6
      7:               3 2019-12-14    9
      8:               3 2019-12-14    9
      9:               3 2019-12-14    9
      10 个月 后
      3 年 后