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"
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常。第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"
Run Code Online (Sandbox Code Playgroud)
apply()
首先将输入转换为矩阵,然后在该矩阵上运行sd()时,将得到一个简单的向量。
但是当您进行.[,3]
小标题操作时,您会得到小标题返回。选择一列并不会像data.frames一样简化为向量。请注意,如果df
是data.frame而不是tibble ,您将获得不同的行为。
因此,“问题”并不是ifelse()
真的。事实上,您正在对小对象进行比较,因此保留了形状而不是简化为矢量。碰巧的是,小标题+大于/小于-将按设计返回矩阵。
归档时间: |
|
查看次数: |
37 次 |
最近记录: |