Reputation: 282
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:
I would like this to be done using apply Result should look like this:
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
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)))
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
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
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