-6

I want to use tidyverse to take a dataframe df and replace all non-zero values to a value of 1. enter image description here

I Del Toro
  • 913
  • 4
  • 15
  • 36
  • 6
    So greater than zero or non-zero? And please provide a clear [reproducible example](https://stackoverflow.com/q/5963269/1320535) without screenshots. – Julius Vainora Jan 16 '19 at 23:40

3 Answers3

15

The following will convert all non-zero numeric values to 1:

df.richness %>% mutate_if(is.numeric, ~1 * (. != 0))

while

df.richness %>% mutate_if(is.numeric, ~1 * (. > 0))

will do that with those greater than zero.

Julius Vainora
  • 47,421
  • 9
  • 90
  • 102
9

Alternatively, if you had only numeric data in the dataframe e.g. with sites as the rownames, this would be a simple way without the tidyverse.

df.richness[df.richness > 0] <- 1 
A.Elsy
  • 128
  • 1
  • 7
0

We can also convert to logical, then back to numeric:

library(dplyr)

df %>% mutate(across(where(is.numeric), ~+as.logical(.x)))

 num1 logical1 num2 char1
1    1     TRUE    0     a
2    1     TRUE    1     b
3    1     TRUE    1     c
4    0     TRUE    1     d
5    1    FALSE    1     e
6    1    FALSE    1     f
7    0    FALSE    0     g
8    1    FALSE    1     h

data

structure(list(num1 = c(1, 2, 3, 0, 1, 99, 0, 2), logical1 = c(TRUE, 
TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE), num2 = c(0, 6, 
7, 8, 9, 10, 0, 1), char1 = c("a", "b", "c", "d", "e", "f", "g", 
"h")), class = "data.frame", row.names = c(NA, -8L))

  num1 logical1 num2 char1
1    1     TRUE    0     a
2    2     TRUE    6     b
3    3     TRUE    7     c
4    0     TRUE    8     d
5    1    FALSE    9     e
6   99    FALSE   10     f
7    0    FALSE    0     g
8    2    FALSE    1     h
GuedesBF
  • 8,409
  • 5
  • 19
  • 37