`dplyr :: if_else ()` по сравнению с базовым R `ifelse ()` - почему ошибка rbindlist? - PullRequest
0 голосов
/ 25 апреля 2019

Этот блок кода ниже, использующий 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()

table

Сначала я попробовал это с базой 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.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Не flextable эксперт, но после решения вашей проблемы я наблюдаю

df <- tibble::tibble(col1 = c(5, 2), col2 = c(6, 4))

ifelse(apply(df[, 1:2], 1, sum) > 10 & df[, 2] > 5, "True", "False")
#     col2   
#[1,] "True" 
#[2,] "False"

, что является матрицей 2 X 1 и

dplyr::if_else(apply(df[, 1:2], 1, sum) > 10 & df[, 2] > 5, "True", "False")
#[1] "True"  "False"

- символьный вектор. Так что если вы делаете

df2 <- tibble(col1 = c(5, 2), col2 = c(6, 4)) %>% 
       mutate(col3 = as.character(ifelse(apply(.[, 1:2], 1, sum) > 10 & .[, 2] > 5, 
                   "True", "False")))

работает как положено.

1 голос
/ 25 апреля 2019

Как продемонстрировал @ ronak-shah, ваш ifelse создает матрицу, что не радует flextable;)

Вам не нужно форматировать данные перед использованием flextable.Например, я бы использовал colformat_lgl там:

df2 <- tibble(col1 = c(5, 2), col2 = c(6, 4)) %>% 
  mutate( col3 = rowSums(.) > 10 & col2 > 5 )

flextable(df2) %>% 
  colformat_lgl("col3", true = "True", false = "False")
...