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/