有条件地操纵R数据帧

时间:2018-05-05 21:47:10

标签: r dataframe converter

我有一个带整数的数据框,我想将它们转换成二进制系统(如果你愿意,可以转换成三级),如果大于x则变为1,如果小于y,则变为-1,等于0。

这是一个示例数据框:

  var1 var2 var3
  30    13   2
  20    29   3

这是我的新数据框应该是什么样的(x是27,y是4):

  var1 var2 var3
  1     0   - 1
  0     1    -1

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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。

返回

dat
  var1 var2 var3
1    1    0   -1
2    0    1   -1

数据

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))

答案 1 :(得分:1)

这是一种相对简洁的方法,可以使用mutate_all中的case_whendplyr进行管理:

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的嵌套应用程序来完成,虽然它的可扩展性较差(即如果条件列表增长,很快就会变得难以处理):

ifelse(df > x, 1, ifelse(df < y, -1, 0))

虽然你提到你正在做&#34;大学&#34;编码,也许就是你所需要的。