выбрать значение столбца на основе логических значений нескольких столбцов - R - PullRequest
0 голосов
/ 06 мая 2018

Мои данные выглядят так, как показано ниже,

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

И ожидаю вывод как ниже

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

Как видите, из T1, T2 и T3 выбираются только эти значения на основе логических значений в X1, X2 и X3.

Я написал глупый код, используя цикл for, ища лучший подход ..

Ответы [ 2 ]

0 голосов
/ 06 мая 2018
x = c("X1", "X2", "X3")
t = c("T1", "T2", "T3")
df[, "T"] = rowSums(df[, x] * df[, t])

Пояснение:

при умножении df[, x] * df[, t] вы получите нужные значения:

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

, затем просто rowSums, чтобы получить значения

[1] 21 32 19
0 голосов
/ 06 мая 2018

Мы умножаем первые три столбца (двоичные столбцы) на следующие три столбца (0 * любое значение = 0) и получаем pmax (поскольку в строке есть только одно ненулевое значение), чтобы создать 'T 'столбец

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...