【发布时间】:2019-04-25 13:40:37
【问题描述】:
下面使用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()
我首先尝试使用 base 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.
【问题讨论】:
-
如果您使用
fill=TRUE运行基础ifelse会发生什么? -
如果我在
"False"之后附加, fill = TRUE,我仍然会得到同样的错误。即使这有效,我也很好奇发生了什么。 -
看看
str(df2)。您可以看到df2$col3是 2x1matrix而df1$col3是chr向量。 -
此外,您的
dplyr语法似乎有些不寻常。为什么不... + mutate(col3 = if_else(col1 + col2 > 10 & col2 < 5, "True", "False"))?此处无需使用MARGIN = 1调用apply,因为操作已按行向量化。 -
@JasonHunter 我仍然建议不要在
dplyr/tidyr方法中使用apply(正如您所发现的,基于apply的解决方案可能会导致unexpected results在处理data.frames 时)。如果您有多个(和/或不同数量的)列,则更多tidyverse-canonical 方法是从宽到长重塑,然后在重塑回宽之前对长数据进行操作。期待您的下一个 SO 问题的扩展;-)
标签: r if-statement dplyr flextable