使用dplyr有条件地将列中的值替换为另一列中的值

时间:2017-10-20 14:50:17

标签: r dplyr tidyverse

我真的很难找到答案,如果它重复,我会道歉。

我会制作一些虚拟数据来解释我的问题。

tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0))

# A tibble: 3 x 3
      a sample1 sample2
 <dbl>   <dbl>   <dbl>
1   0.1       0       1
2   0.2       1       1
3   0.3       1       0

如何有条件地更改列 sample1 sample2 中的值,以便如果它们等于1,则它们将取值 a

产生的结果应如下所示:

# A tibble: 3 x 3
      a sample1 sample2
 <dbl>   <dbl>   <dbl>
1   0.1       0     0.1
2   0.2     0.2     0.2
3   0.3     0.3       0

理想情况下,我不想为每个单独的样本列(我有> 100个样本列)执行此操作,因此循环列的方法会更好(尽管我知道循环是恶魔)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以将mutate_atifelse

一起使用
df %>% mutate_at(vars(starts_with('sample')), funs(ifelse(. == 1, a, .)))

# A tibble: 3 x 3
#      a sample1 sample2
#  <dbl>   <dbl>   <dbl>
#1   0.1     0.0     0.1
#2   0.2     0.2     0.2
#3   0.3     0.3     0.0

vars(starts_with('sample'))匹配以sample开头的所有列,mutate_at将函数funs(ifelse(. == 1, a, .))应用于每列; .代表匹配的列。

如果您确定所有样本列仅包含10,则可以缩短为:

df %>% mutate_at(vars(starts_with('sample')), funs(. * a))

# A tibble: 3 x 3
#      a sample1 sample2
#  <dbl>   <dbl>   <dbl>
#1   0.1     0.0     0.1
#2   0.2     0.2     0.2
#3   0.3     0.3     0.0

答案 1 :(得分:-1)

使用which()的非dplyr解决方案:

> t=tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0))

> whichRows=which(t$sample1==t$sample2)

> t[whichRows,c('sample1','sample2')]<-t[whichRows,'a']

> t
# A tibble: 3 x 3
      a sample1 sample2
  <dbl>   <dbl>   <dbl>
1   0.1     0.0     1.0
2   0.2     0.2     0.2
3   0.3     1.0     0.0