letimome
letimome

Reputation: 936

How to replace certain values with their column name

I have a following table in R

df <- data.frame('a' = c(1,0,0,1,0),
                 'b' = c(1,0,0,1,0),
                 'c' = c(1,1,0,1,1))
df
   a  b  c
1  1  1  1
2  0  0  1
3  0  0  0
4  1  1  1
4  0  0  1

What I want is to replace the row value with the column name whenever the row is equal to 1. The output would be this one:

   a  b  c
1  a  b  c
2  0  0  c
3  0  0  0
4  a  b  c
4  0  0  c

How can I do this in R? Thanks.

Upvotes: 3

Views: 272

Answers (5)

James
James

Reputation: 66834

You can do it with ifelse, but you have to do some intermediate transposing to account for R's column-major order processing.

data.frame(t(ifelse(t(df)==1,names(df),0)))
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

Upvotes: 1

akrun
akrun

Reputation: 886948

We can use

df[] <- names(df)[(NA^!df) * col(df)]
df[is.na(df)] <- 0
df
#  a b c
#1 a b c
#2 0 0 c
#3 0 0 0
#4 a b c
#4 0 0 c

Upvotes: 4

Tim Biegeleisen
Tim Biegeleisen

Reputation: 520918

We can try iterating over the names of the data frame, and then handling each column, for a base R option:

df <- data.frame(a=c(1,0,0,1,0), b=c(1,0,0,1,0), c=c(1,1,0,1,1))

df <-  data.frame(sapply(names(df), function(x) {
    y <- df[[x]]
    y[y == 1] <- x
    return(y)
}))

df

  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

Demo

Upvotes: 2

talat
talat

Reputation: 70256

I would use Map and replace:

df[] <- Map(function(n, x) replace(x, x == 1, n), names(df), df)
df
#   a b c
# 1 a b c
# 2 0 0 c
# 3 0 0 0
# 4 a b c
# 5 0 0 c

Upvotes: 6

BENY
BENY

Reputation: 323226

You can try stack and unstack

a=stack(df)
a
   values ind
1       1   a
2       0   a
3       0   a
4       1   a
5       0   a
6       1   b
7       0   b
8       0   b
9       1   b
10      0   b
11      1   c
12      1   c
13      0   c
14      1   c
15      1   c
a$values[a$values==1]=as.character(a$ind)[a$values==1]
unstack(a)
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

Upvotes: 2

Related Questions