1

My data looks like below,

df=data.frame("X1" = c(1, 0, 0), "X2" = c(0, 0, 1), "X3" = c(0, 1, 0),
           "T1" = c(21, 20, 15), "T2" = c(35, 16, 19), "T3" = c(22, 32, 16))

X1  X2  X3  T1  T2  T3
1   0   0   **21**  35  22
0   0   1   20  16  **32**
0   1   0   15  **19**  16

And am expecting output as below

X1  X2  X3  T
1   0   0   21
0   0   1   32
0   1   0   19

As you can see, from T1,T2 and T3 only those values are picked based on boolean values in X1,X2 and X3.

I wrote a silly code using for loop, looking for a best approach..

akrun
  • 874,273
  • 37
  • 540
  • 662
Adarsha Murthy
  • 145
  • 3
  • 13

2 Answers2

5

We multiply the first three columns (binary columns) with the next three columns (0 * any value = 0) and get the pmax (as there is only one non-zero value per row) to create the 'T' column

cbind(df[1:3], T = do.call(pmax, df[1:3]* df[4:6]))
#  X1 X2 X3  T
#1  1  0  0 21
#2  0  0  1 32
#3  0  1  0 19
akrun
  • 874,273
  • 37
  • 540
  • 662
3
x = c("X1", "X2", "X3")
t = c("T1", "T2", "T3")
df[, "T"] = rowSums(df[, x] * df[, t])

Explanation:

when you multiply df[, x] * df[, t], you get the values you want:

>>> df[, x] * df[, t]
  X1 X2 X3
1 21  0  0
2  0  0 32
3  0 19  0

then just do rowSums to get the values

[1] 21 32 19
rafaelc
  • 57,686
  • 15
  • 58
  • 82