我正在使用类似于下面生成的数据框的数据框:
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
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
答案 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中也对此进行了描述。