用 mutate_at dplyr 将一列单独划分

数据挖掘 r 数据框 编程 dplyr
2022-03-05 23:25:34

嗨,我想使用 mutate_at() 将我选择的列的每个非零值变为 1

 BRAND  MEDIA_TYPE    INV1       INV2
   <chr>  <chr>      <dbl>     <dbl>
  b1     newspapers    2         27
  b1     magazines     3         0
  b2     newspapers    0         0
  b3     tv            1        145
  b4     newspapers    4         40
  b5     newspapers    5         0
  b1     newspapers    1         0
  b2     newspapers    0         28

最终结果应如下所示:

 BRAND  MEDIA_TYPE    INV1      INV2
   <chr>  <chr>      <dbl>     <dbl>
  b1     newspapers    1         1
  b1     magazines     1         0
  b2     newspapers    0         0
  b3     tv            1         1
  b4     newspapers    1         1
  b5     newspapers    1         0
  b1     newspapers    1         0
  b2     newspapers    0         1

你对如何解决它有什么建议吗?谢谢!!

2个回答
mutate_at(my_data, vars(starts_with("INV")), sign)

虽然我看到你的 INV1 列是一个日期?我不确定这会对事情产生多大影响..

如果您没有以某个名称开头的列,另一种方法是执行此操作:

df %>% mutate(INV1 = INV1/INV1, INV2 = INV2/INV2) %>% 
 replace(is.na(.), 0) 
 
df = tibble(
            `BRAND` = c('b1','b1','b2','b3','b4','b5','b1','b2'),
            `MEDIA_TYPE` = c('newspapers','magazines','newspapers',
            'tv','newspapers','newspapers','newspapers','newspapers'),
            `INV1` = c(2,3,0,1,4,5,1,0),
            `INV2` = c(27,0,0,145,40,0,0,28)
            ) 
#The replace(is.na(.), 0) 
#is for replace NaN resulting of division by 0

Output: 

# A tibble: 8 x 4
  BRAND MEDIA_TYPE  INV1  INV2
  <chr> <chr>      <dbl> <dbl>
1 b1    newspapers     1     1
2 b1    magazines      1     0
3 b2    newspapers     0     0
4 b3    tv             1     1
5 b4    newspapers     1     1
6 b5    newspapers     1     0
7 b1    newspapers     1     0
8 b2    newspapers     0     1