【发布时间】: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