`dplyr :: if_else()与基数R`ifelse()`相比-为什么rbindlist错误?

时间:2019-04-25 13:40:38

标签: r if-statement dplyr flextable

下面使用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 个答案:

答案 0 :(得分:3)

不是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 :(得分:1)

如@ 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")