antekkalafior
antekkalafior

Reputation: 282

Converting dataframe of strings to categorical values

I need to convert the entire data frame that consists of only "0/1", "1/1", and "0/0" to categorical values. I would like it to assign numbers like this 0 to "0/0" 1 to "1/1" and 2 to "0/1"

The Data frame looks something like this, but much bigger:

enter image description here

I would like this to be done using apply Result should look like this:

enter image description here

Here is the sample data frame

df <- data.frame(replicate(10,sample(c("0/1", "1/1", "0/0"), 20,rep=TRUE)))

Upvotes: 1

Views: 42

Answers (2)

benson23
benson23

Reputation: 19097

If apply is not a must in the solution, I'll use dplyr mutate() and case_when().

df %>% mutate(across(everything(), 
                     ~ case_when(.x == "1/1" ~ 1, 
                                 .x == "0/0" ~ 0, 
                                 .x == "0/1" ~ 2)))

Output

   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   1  2  2  2  0  1  2  0  1   0
2   2  2  0  0  0  0  2  2  0   1
3   1  1  0  1  0  2  0  1  0   2
4   1  2  1  0  1  1  1  2  2   2
5   2  0  1  0  0  2  2  0  1   2
6   2  2  0  0  0  1  1  2  2   2
7   2  0  0  2  2  1  0  0  0   2
8   1  2  2  2  2  0  1  2  2   2
9   1  0  1  2  2  0  1  0  1   0
10  1  0  1  2  1  1  0  2  1   2
11  1  0  0  0  2  2  1  0  1   0
12  2  1  2  0  0  0  0  0  1   1
13  0  2  0  2  2  1  1  1  2   2
14  0  0  0  1  2  0  0  0  1   1
15  1  0  1  0  1  0  0  2  1   2
16  0  0  0  2  0  1  2  0  2   2
17  0  2  2  2  0  2  1  2  0   0
18  2  1  2  2  0  1  1  2  2   0
19  0  2  2  2  0  2  1  2  2   0
20  2  0  2  2  0  1  1  0  0   1

Input

    X1  X2  X3  X4  X5  X6  X7  X8  X9 X10
1  1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0
2  0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1
3  1/1 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1
4  1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1
5  0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1
6  0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1
7  0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1
8  1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1
9  1/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0
10 1/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1
11 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/0
12 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1
13 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1
14 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 1/1
15 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/1 1/1 0/1
16 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1
17 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0
18 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0
19 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0
20 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1

Upvotes: 1

akrun
akrun

Reputation: 887118

Create a named vector and use that to match and replace the values in the dataset

df[] <- setNames(c(0, 1, 2), c("0/0", "1/1", "0/1"))[as.matrix(df)]

-output

> df
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   1  1  2  0  1  2  1  1  1   0
2   1  1  1  0  0  1  1  2  0   1
3   2  1  1  1  1  1  2  2  2   2
4   2  1  1  0  0  0  0  2  2   0
5   0  2  0  2  2  2  0  0  0   2
6   0  0  0  2  0  1  1  0  0   0
7   2  1  1  0  1  0  2  2  0   1
8   2  0  2  1  2  2  2  1  2   0
9   0  1  1  0  1  2  2  1  2   0
10  2  0  2  1  1  1  1  2  2   1
11  2  2  0  1  1  0  0  1  2   0
12  2  1  1  1  1  2  0  1  0   1
13  0  1  2  2  2  1  2  2  1   1
14  0  0  0  0  1  2  2  1  0   1
15  2  2  0  2  1  0  0  0  1   2
16  0  2  2  0  2  1  1  2  2   0
17  1  1  1  1  1  1  1  0  2   1
18  1  1  0  0  1  1  1  1  2   0
19  0  1  0  1  1  0  1  2  0   1
20  1  0  2  1  0  0  2  1  0   0
> str(df)
'data.frame':   20 obs. of  10 variables:
 $ X1 : num  1 1 2 2 0 0 2 2 0 2 ...
 $ X2 : num  1 1 1 1 2 0 1 0 1 0 ...
 $ X3 : num  2 1 1 1 0 0 1 2 1 2 ...
 $ X4 : num  0 0 1 0 2 2 0 1 0 1 ...
 $ X5 : num  1 0 1 0 2 0 1 2 1 1 ...
 $ X6 : num  2 1 1 0 2 1 0 2 2 1 ...
 $ X7 : num  1 1 2 0 0 1 2 2 2 1 ...
 $ X8 : num  1 2 2 2 0 0 2 1 1 2 ...
 $ X9 : num  1 0 2 2 0 0 0 2 2 2 ...
 $ X10: num  0 1 2 0 2 0 1 0 0 1 ...

NOTE: The sample data created was without any set.seed, thus the values may be different

Upvotes: 2

Related Questions