强制mutate_each为通过ifelse评估的列子集创建新的列名

时间:2016-02-05 18:51:40

标签: r if-statement dataframe dplyr

问题

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

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

1 个答案:

答案 0 :(得分:1)

如果为funs中的vars...参数提供命名向量,则可以在mutate_each参数中仅使用单个函数时创建其他列。以下是使用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中也对此进行了描述。