首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有条件操纵R Dataframe

有条件操纵R Dataframe
EN

Stack Overflow用户
提问于 2018-05-05 21:47:10
回答 2查看 25关注 0票数 0

我有一个带整数的数据,我想把它们转换成一个二进制系统(如果你愿意的话),当它们大于x时变成1,如果小于y,就变成-1,以及0。

这是一个示例dataframe:

代码语言:javascript
运行
复制
  var1 var2 var3
  30    13   2
  20    29   3

这就是我的新的dataframe (x是27,y是4)的样子:

代码语言:javascript
运行
复制
  var1 var2 var3
  1     0   - 1
  0     1    -1

有什么简单的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-05 21:55:02

下面是一种相对简洁的方法,可以使用mutate_alldplyrcase_when来管理这个问题。

代码语言:javascript
运行
复制
x <- 27
y <- 4
df %>% mutate_all(funs(case_when(. > x ~ 1, . < y ~ -1, TRUE ~ 0)))

#   var1 var2 var3
# 1    1    0   -1
# 2    0    1   -1

这也可以用嵌套的ifelse应用程序来完成,尽管它的可扩展性较差(也就是说,如果条件列表增加,它很快就会变得难以处理):

代码语言:javascript
运行
复制
ifelse(df > x, 1, ifelse(df < y, -1, 0))

虽然您提到您正在进行“三级”编码,但这也许是您所需要的。

票数 1
EN

Stack Overflow用户

发布于 2018-05-05 22:01:41

这是一个快速的R基答案。这将是超级快,只要数据集是相当小的相对于可用的RAM数量。

代码语言:javascript
运行
复制
dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
                      rightmost.closed=TRUE) - 1L

在这里,由于每个列都有相同的中断,所以您可以将data.frame的副本转换为矩阵,并在使用这些中断时运行findInterval。rightmost.closed=TRUE确保这些值包含在它们的集合中。然后,由于findInterval返回以0开头的值,所以减去1即可得到所需的值。

使用dat[] <-将生成的向量放入data.frame中。

这会返回

代码语言:javascript
运行
复制
dat
  var1 var2 var3
1    1    0   -1
2    0    1   -1

数据

代码语言:javascript
运行
复制
dat <- 
structure(list(var1 = c(30L, 20L), var2 = c(13L, 29L), var3 = 2:3),
.Names = c("var1", "var2", "var3"), class = "data.frame",
row.names = c(NA, -2L))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50194301

复制
相关文章

相似问题

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