【问题标题】:Forcing mutate_each to create new column names for a subset of columns evaluate via ifelse通过 ifelse 强制 mutate_each 为列的子集创建新列名
【发布时间】:2016-02-05 18:51:39
【问题描述】:

问题

我正在使用类似于下面生成的提取的数据框:

set.seed(1)
df <- data.frame(columnA1 = 1:10,
                 columnB1 = 1:10,
                 columnB99 = runif(n = 10))

我想创建一组列,其中包含与从列名称中具有 1 的列派生的值相对应的自定义标志。

方法

我目前的做法总结如下:

require(dplyr); require(magrittr)
df %<>%
    mutate_each(funs(ifelse(. == 1, "val1",
                            ifelse(. == 10, "val10", NA))),
                contains("1"))

这会生成所需的值,但不会创建额外的列:

> head(df, n = 10)
   columnA1 columnB1  columnB99
1      val1     val1 0.26550866
2      <NA>     <NA> 0.37212390
3      <NA>     <NA> 0.57285336
4      <NA>     <NA> 0.90820779
5      <NA>     <NA> 0.20168193
6      <NA>     <NA> 0.89838968
7      <NA>     <NA> 0.94467527
8      <NA>     <NA> 0.66079779
9      <NA>     <NA> 0.62911404
10    val10    val10 0.06178627

评论/尝试 1

I also tried:
df %<>%
    mutate_each(funs(flg = ifelse(. == 1, "val1",
                            ifelse(. == 10, "val10", NA))),
                contains("1"))

但它会产生相同的结果。在this discussion 之后,我猜我在funs 中提供后缀时犯了错误。


评论跟进

例如代码:

df %<>%
    mutate_each(funs(ifelse(. == 1, "val1", NA),
                     ifelse(. == 10, "val10", NA)),
                contains("1"))
head(df, 10)

会创建额外的列,但结果并不完全令人满意:

> head(df, 10)
   columnA1 columnB1  columnB99 columnA1_ifelse columnB1_ifelse columnA1_ifelse_ifelse columnB1_ifelse_ifelse
1         1        1 0.26550866            <NA>            <NA>                     NA                     NA
2         2        2 0.37212390            <NA>            <NA>                     NA                     NA
3         3        3 0.57285336            <NA>            <NA>                     NA                     NA
4         4        4 0.90820779            <NA>            <NA>                     NA                     NA
5         5        5 0.20168193            <NA>            <NA>                     NA                     NA
6         6        6 0.89838968            <NA>            <NA>                     NA                     NA
7         7        7 0.94467527            <NA>            <NA>                     NA                     NA
8         8        8 0.66079779            <NA>            <NA>                     NA                     NA
9         9        9 0.62911404            <NA>            <NA>                     NA                     NA
10       10       10 0.06178627           val10           val10                     NA                     NA

【问题讨论】:

  • @akrun 我在想通过提供该后缀可能会偏离默认行为。
  • 我在原始数据集“df”上尝试了您编辑的代码。它没有创建额外的列。我正在使用dplyr_0.4.3
  • @akrun 我真的不知道为什么。我又试了一次,它运行了(pastebin)。我也在使用0.4.3 版本的dplyr
  • 可能是第二次运行创建的。我不知道这是否是一个错误,但可以肯定的是,NA 列不是预期的
  • @akrun 谢谢,它发生的原因很有趣。

标签: r if-statement dataframe dplyr


【解决方案1】:

如果您在mutate_each 中为vars... 参数提供命名向量,则可以在funs 参数中仅使用单个函数时创建额外的列。这是一个使用setNames的例子:

mutate_each(df, funs(ifelse(. == 1, "val1",
                            ifelse(. == 10, "val10", NA))),
                setNames(contains("1"), c("x", "y")))
#   columnA1 columnB1  columnB99     x     y
#1         1        1 0.26550866  val1  val1
#2         2        2 0.37212390  <NA>  <NA>
#3         3        3 0.57285336  <NA>  <NA>
#4         4        4 0.90820779  <NA>  <NA>
#5         5        5 0.20168193  <NA>  <NA>
#6         6        6 0.89838968  <NA>  <NA>
#7         7        7 0.94467527  <NA>  <NA>
#8         8        8 0.66079779  <NA>  <NA>
#9         9        9 0.62911404  <NA>  <NA>
#10       10       10 0.06178627 val10 val10

another Q&A 中也对此进行了描述。

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多