Этот блок кода ниже, использующий dplyr::if_else()
, работает без проблем и создает показанную гибкую таблицу.
library(tidyverse)
library(flextable)
# utilizing dplyr if_else
df1 <- tibble(col1 = c(5, 2), col2 = c(6, 4)) %>%
mutate(col3 = if_else(apply(.[, 1:2], 1, sum) > 10 & .[, 2] > 5,
"True",
"False"))
df1 %>% flextable() %>% theme_zebra()
Сначала я попробовал это с базой R ifelse()
и получил ошибку, показанную ниже. Ошибка, кажется, не имеет никакого смысла. Кто-нибудь может объяснить? В моем фрейме данных нет около 15 столбцов.
# utilizing base R ifelse
df2 <- tibble(col1 = c(5, 2), col2 = c(6, 4)) %>%
mutate(col3 = ifelse(apply(.[, 1:2], 1, sum) > 10 & .[, 2] > 5,
"True",
"False"))
df2 %>% flextable() %>% theme_zebra()
# Error in rbindlist(x$content$data) :
# Item 5 has 15 columns, inconsistent with item 1 which has 14 columns.
# To fill missing columns use fill=TRUE.
ifelse
сfill=TRUE
? - person TheSciGuy   schedule 25.04.2019, fill = TRUE
после"False"
, я все равно получу ту же ошибку. Даже если это сработало, мне любопытно, что происходит. - person Display name   schedule 25.04.2019str(df2)
. Вы можете видеть, чтоdf2$col3
— этоmatrix
2x1, тогда какdf1$col3
— это векторchr
. - person Maurits Evers   schedule 25.04.2019dplyr
кажется несколько необычным. Почему бы не сделать... + mutate(col3 = if_else(col1 + col2 > 10 & col2 < 5, "True", "False"))
? Здесь нет необходимости в вызовеapply
сMARGIN = 1
, поскольку операции уже векторизованы по строкам. - person Maurits Evers   schedule 25.04.2019apply
в подходеdplyr
/tidyr
(как вы узнали, решения на основеapply
могут привести к неожиданные результаты при работе сdata.frame
s). Если у вас есть несколько (и/или разное количество) столбцов, болееtidyverse
-каноническим подходом будет изменение формы с широкой на длинную, а затем работа с вашими длинными данными перед изменением формы обратно на широкую. С нетерпением жду вашего следующего вопроса SO, чтобы расширить ;-) - person Maurits Evers   schedule 26.04.2019