r - 为什么基 R `ifelse()` 会间歇性地将我的字符向量转换为矩阵?

标签 r if-statement

library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
# # A tibble: 2 x 3
#    col1  col2  col3
#   <dbl> <dbl> <dbl>
# 1     5     6     9
# 2     2     4     9


df.cha <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3,
                                      "True",
                                      "False"))
df.cha$col4
#[1] "False" "True" 

上面的代码工作正常。正如我所期望的,第 4 列是一列字符。但是,我可以在 ifelse 语句中添加一个额外条件,即 & .[, 3] > 0,突然间 R 正在为第 4 列创建矩阵,而不是将其保留为字符像我想要的那样的矢量。见下文。

这是为什么?

df.mat <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3 & 
                                        .[, 3] > 0,  # I only added this
                                      "True",
                                      "False"))
df.mat$col4
#      col3   
# [1,] "False"
# [2,] "True" 

最佳答案

apply() 首先将您的输入转换为矩阵,然后当您在该矩阵上运行 sd() 时,您会得到一个简单的向量。

但是当你对 tibble 执行 .[,3] 时,你会得到一个 tibble。选择一列并不像 data.frames 那样简化为向量。请注意,如果 df 是 data.frame 而不是 tibble,您会得到不同的行为。

所以“问题”实际上并不在于 ifelse() 。事实上,您正在对 tibble 进行比较,因此形状被保留而不是简化为向量。碰巧 tibble + 大于/小于将按设计返回矩阵。

关于r - 为什么基 R `ifelse()` 会间歇性地将我的字符向量转换为矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853744/

相关文章:

Python ggplot : Is it possible to turn off the GUI displayed? 并获取命令行 ("non-interactive plotting"/"batch")

r - 如何在 R 中绘制预分箱直方图

windows - 如何在 parse() 之后保留多字节字符

r - 测试 NA 并根据结果选择值

javascript - 如何将 if 语句添加到对象 block

Beaker Notebook 中的 R-scatterplot3d 渲染

python - R lm 与 Python sklearn linear_model

c++ - 如何打印出给定范围内的直角三角形的周长和个数?

python - 避免多个 IF 以确保 Mccabe 复杂性

c++ - 中断 if 语句 c++ 错误