【问题标题】:functional expression not work as column name in R函数表达式不能用作 R 中的列名
【发布时间】:2016-08-25 19:22:10
【问题描述】:

我尝试向数据框中添加一个具有指定列名的新列。

这行得通:

dat = data.frame(x1 = 1:10,
                 x2 = 101:110,
                 x3 = 1:2,
                 x4 = 2:1)

cbind(dat, 'x10' = 1:10)

结果:

   x1  x2 x3 x4 x10
1   1 101  1  2   1
2   2 102  2  1   2
3   3 103  1  2   3
4   4 104  2  1   4
5   5 105  1  2   5
6   6 106  2  1   6
7   7 107  1  2   7
8   8 108  2  1   8
9   9 109  1  2   9
10 10 110  2  1  10

但使用函数表达式作为列名不起作用

cbind(dat, paste0('x10', '_flag') = 1:10)

错误:“cbind(dat, paste0('x10', '_flag') ="

中出现意外的 '='

我在想

column_name = paste0('x10', '_flag')
cbind(dat, column_name = 1:10)

但它将“column_name”作为列名,而不是它所引用的字符串(感谢@42-纠正我)

如何让 R 知道 paste0() 只是一个字符串?我试过as.character(paste0()),但没有用。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 不幸的是,第二种方法不会解释 column_name 所以你最终会得到 dat$column_name 是 1:10 而不是你希望的。参数名称的表达式不会在给定函数的配对列表中得到解释。您可以使用assign(在第一个参数位置)获得对被评估为字符值的表达式的解释,但它最终会成为一种非常庞大的代码,通常意味着有更好的选择。

标签: r string columnname


【解决方案1】:

您应该学习使用"[",而不是使用cbind,因为它在j 参数位置(在第一个逗号之后)接受计算的列名:

> dat[ , paste0('x10', '_flag') ] = 1:10
> dat
   x1  x2 x3 x4 x10_flag
1   1 101  1  2        1
2   2 102  2  1        2
3   3 103  1  2        3
4   4 104  2  1        4
5   5 105  1  2        5
6   6 106  2  1        6
7   7 107  1  2        7
8   8 108  2  1        8
9   9 109  1  2        9
10 10 110  2  1       10

这等效于与“[[”类似的策略

dat[[ paste0('x10', '_flag') ]] = 1:10

注意:这可以避免不幸的新手使用 $ 分配计算出的列名

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2022-11-12
    • 1970-01-01
    • 2022-01-06
    • 2012-12-25
    • 2019-02-13
    • 2021-01-15
    • 2018-06-02
    • 2022-01-10
    相关资源
    最近更新 更多