В dplyr измените логический столбец, где любой из набора других логических столбцов является истинным - PullRequest
1 голос
/ 27 апреля 2020

У меня есть фрейм данных, который выглядит следующим образом:

typ1  typ2  typ3
   T     T     F
   F     F     F
   T     F     F

, и я хочу преобразовать 4-й логический столбец, определяющий, являются ли какие-либо другие три ИСТИНАМИ, поэтому {T, F, T}.

mutate(isAnyType = any(typ1, typ2, typ3)), кажется, использует целые столбцы, когда я хотел бы использовать информацию для каждой строки. Любое понимание приветствуется.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Мы можем использовать reduce с |, чтобы проверить, есть ли какие-либо ИСТИННЫЕ элементы в каждой строке

library(dplyr)
library(purrr)
df1 %>%
   mutate(isAnyType = reduce(., `|`))

Или использовать rowSums в base R

df1$isAnyType <- rowSums(df1) > 0

Или другой вариант pmap

df1 %>%
   mutate(isAnyType = pmap_lgl(., ~ any(c(...)))

data

df1 <- structure(list(typ1 = c(TRUE, FALSE, TRUE), typ2 = c(TRUE, FALSE, 
FALSE), typ3 = c(FALSE, FALSE, FALSE)), class = "data.frame", 
row.names = c(NA, 
-3L))
0 голосов
/ 27 апреля 2020

Если вы воспользуетесь булевыми значениями, хранящимися как T = 1, F = 0, я думаю, вы могли бы использовать функцию rowSums () для оценки экземпляров T / F по строкам. Это то, что вы ищете?

ввод:

df <- data.frame(typ1 = c(T, F, T),
                 typ2 = c(T,F, F),
                 typ3 = c(F, F, F))
library(dplyr)
df %>% 
  mutate(typ4 = ifelse(rowSums(df) ==0, F, T))

вывод:

   typ1  typ2  typ3  typ4
1  TRUE  TRUE FALSE  TRUE
2 FALSE FALSE FALSE FALSE
3  TRUE FALSE FALSE  TRUE
0 голосов
/ 27 апреля 2020

Похоже, ответ можно найти здесь: Использование any () против | в dplyr :: mutate

Вместо любого (), который использует весь фрейм данных, я могу просто использовать оператор OR, чтобы mutate(isAnyType = typ1 |typ2 |typ3)) работал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...