我有一个带整数的数据框,我想将它们转换成二进制系统(如果你愿意,可以转换成三级),如果大于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
有一种简单的方法吗?
答案 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_when
和dplyr
进行管理:
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;编码,也许就是你所需要的。