首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ifelse对一系列变量进行分组

如何使用ifelse对一系列变量进行分组
EN

Stack Overflow用户
提问于 2021-01-11 21:17:22
回答 3查看 41关注 0票数 0

在我的数据集中,我有一个名为ref的变量,范围是0-7。每个参与者都有一个分数。我想对它进行分组,0-3表示“低”,4-7表示“高”。

因此,我尝试创建一个新变量,并尝试使用ifelse函数

代码语言:javascript
复制
control_vs_fast$refsplit <- (ifelse(control_vs_fast$reflection >= 0 & control_vs_fast$reflection <=3, 'low', ifelse(control_vs_slow$reflection >3, 'high', 'no')))

我想知道是否有一个不同的函数我可以使用,这样我就不需要有' no‘,因为我没有缺失值。

抱歉,如果我说得不清楚,我是个新手:(

编辑:非常感谢大家!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-11 21:21:01

也许你可以试试下面的代码

代码语言:javascript
复制
within(
  control_vs_fast,
  refsplit <- c("high","low")[(reflection <=3)+1]
)

代码语言:javascript
复制
within(
  control_vs_fast,
  refsplit <- ifelse(reflection <=3,"low","high")
)
票数 0
EN

Stack Overflow用户

发布于 2021-01-11 21:24:49

这是一个cut工作得很好的地方。

代码语言:javascript
复制
control_vs_fast <- data.frame(reflection = c(-1:5))
control_vs_fast
#   reflection
# 1         -1
# 2          0
# 3          1
# 4          2
# 5          3
# 6          4
# 7          5

默认情况下,cut使用开端/闭端的数学表示法返回标签:

代码语言:javascript
复制
cut(control_vs_fast$reflection, c(-Inf, 0, 3, Inf))
# [1] (-Inf,0] (-Inf,0] (0,3]    (0,3]    (0,3]    (3, Inf] (3, Inf]
# Levels: (-Inf,0] (0,3] (3, Inf]

我们可以去掉标签,使用整数

代码语言:javascript
复制
cut(control_vs_fast$reflection, c(-Inf, 0, 3, Inf), labels = FALSE)
# [1] 1 1 2 2 2 3 3

或者定义我们自己的标签

代码语言:javascript
复制
cut(control_vs_fast$reflection, c(-Inf, 0, 3, Inf), labels = c("no", "low", "high"))
# [1] no   no   low  low  low  high high
# Levels: no low high
as.character(cut(control_vs_fast$reflection, c(-Inf, 0, 3, Inf), labels = c("no", "low", "high")))
# [1] "no"   "no"   "low"  "low"  "low"  "high" "high"

请注意,如果为labels=FALSE,则所有返回值都是整数,否则它们都是factors。如果您需要字符串(和/或不知道factors是什么),则最后一个带as.character的字符串将提供给您字符串。

更正

但是以上所有这些错误地将0标记为"no"而不是"less"。为了解决这个问题,这里有一个稍微长一点的替代方案。如果您使用整型变量,那么简单的重新赋值就可以按原样工作;但是如果您想要字符串,那么factors将带来一个小问题;这里我将使用as.character变量。

代码语言:javascript
复制
control_vs_fast$refsplit <- as.character(cut(control_vs_fast$reflection, c(0, 3, Inf), labels = c("low", "high"), include.lowest = TRUE))
control_vs_fast
#   reflection refsplit
# 1         -1     <NA>
# 2          0      low
# 3          1      low
# 4          2      low
# 5          3      low
# 6          4     high
# 7          5     high
control_vs_fast$refsplit[is.na(control_vs_fast$refsplit)] <- "no"
control_vs_fast
#   reflection refsplit
# 1         -1       no
# 2          0      low
# 3          1      low
# 4          2      low
# 5          3      low
# 6          4     high
# 7          5     high

解释:

问题是cut中的范围要么是左开(默认),要么是右开。让其中一个bin同时左关闭和右关闭的唯一方法是将其设置为第一个范围/bin,然后添加include.lowest=TRUE。从这里开始,任何小于0的值(如果有)都将是NA,这意味着它不在指定的存储箱中。

在此基础上,我们使用基于NA的索引赋值。

票数 2
EN

Stack Overflow用户

发布于 2021-01-11 21:22:18

下面是一个包含可重现数据的示例:

代码语言:javascript
复制
set.seed(1)
x <- sample(0:7, size = 10, replace = TRUE)

ifelse(x <= 3, 'low', "high")

#  [1] "low"  "low"  "high" "low"  "low"  "high" "high" "low"  "high"
# [10] "low"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65667591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档