【问题标题】:Add a new column to dataframe using mutate_ where column name is specified by a variable使用 mutate_ 向数据框添加新列,其中列名由变量指定
【发布时间】:2017-02-26 11:16:42
【问题描述】:

我有一个数据框,我想向其中添加一列,该列由变量名定义:

df <- diamonds
NewName <- "SomeName"
df <- df %>% mutate_(paste0(NewName," = \"\""))

这给了我以下错误:

Error: attempt to use zero-length variable name

我见过很多 mutate_ 用于更改列名的示例,但不能用于动态创建列。有什么帮助吗?

【问题讨论】:

  • 我没有收到任何错误,只是一个名为SomeName = ""的列
  • 选择所有行再运行一次,这似乎是喜怒无常的
  • 确实,第二次就不行了。
  • 必须使用dplyr 吗? df[[NewName]] &lt;- calculation 呢?如果你想节省一些df$,可以使用with
  • 那行得通,试图在 dplyr 中解决这个问题,有点困惑为什么它有时会起作用,而不是另一个。以下方法也有效(dplyr 中必须有更简洁的方法): df % mutate(NewName = NA) df% rename_(.dots=setNames("NewName", list(NewName) ))

标签: r dataframe dplyr


【解决方案1】:

问题与语句的评估时间有关。据我了解,mutate_ 的目标不是重新创建mutate 的语法,例如使用paste 来创建mutate(SomeName = "")。相反,它是允许生成函数通过。您的方法失败的原因是(我相信)它正在寻找一个名为 "" 的函数。

相反,您需要传入一个可以评估的函数(这里,我使用paste 作为占位符)并使用您的变量设置该列的名称。这应该有效:

df <- diamonds
NewName <- "SomeName"
df <- df %>% mutate_(.dots = setNames("paste('')",NewName))

这也允许更多控制,例如,您可以粘贴cutcolor

df <- df %>% mutate_(.dots = setNames("paste(cut, color)",NewName))

给予:

   carat       cut color clarity depth table price     x     y     z    SomeName
   <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>       <chr>
1   0.23     Ideal     E     SI2  61.5    55   326  3.95  3.98  2.43     Ideal E
2   0.21   Premium     E     SI1  59.8    61   326  3.89  3.84  2.31   Premium E
3   0.23      Good     E     VS1  56.9    65   327  4.05  4.07  2.31      Good E
4   0.29   Premium     I     VS2  62.4    58   334  4.20  4.23  2.63   Premium I
5   0.31      Good     J     SI2  63.3    58   335  4.34  4.35  2.75      Good J
6   0.24 Very Good     J    VVS2  62.8    57   336  3.94  3.96  2.48 Very Good J
7   0.24 Very Good     I    VVS1  62.3    57   336  3.95  3.98  2.47 Very Good I
8   0.26 Very Good     H     SI1  61.9    55   337  4.07  4.11  2.53 Very Good H
9   0.22      Fair     E     VS2  65.1    61   337  3.87  3.78  2.49      Fair E
10  0.23 Very Good     H     VS1  59.4    61   338  4.00  4.05  2.39 Very Good H

(值得注意的是,我也得到了第一次工作的初始语法,然后是随后的失败。值得深入研究。)

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 2011-09-17
    • 2013-08-15
    • 2022-10-05
    • 2018-10-09
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多