有条件地操作R数据帧

有条件地操作R数据帧,r,dataframe,converter,R,Dataframe,Converter,我有一个带整数的数据帧,我想把它们转换成一个二进制(或者三级,如果你愿意的话),如果大于x,它们变成1,如果小于y,它们变成1,否则变成0 这是一个示例数据帧: var1 var2 var3 30 13 2 20 29 3 这就是我的新数据帧的样子(x是27,y是4): 有一种简单的方法可以做到这一点吗?这里有一种相对简洁的方法,可以在dplyr中使用mutate\u all和case\u进行管理: x <- 27 y <- 4 df %>%

我有一个带整数的数据帧,我想把它们转换成一个二进制(或者三级,如果你愿意的话),如果大于x,它们变成1,如果小于y,它们变成1,否则变成0

这是一个示例数据帧:

  var1 var2 var3
  30    13   2
  20    29   3
这就是我的新数据帧的样子(x是27,y是4):


有一种简单的方法可以做到这一点吗?

这里有一种相对简洁的方法,可以在
dplyr
中使用
mutate\u all
case\u进行管理:

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

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

这里有一个相对简洁的方法,可以在
dplyr
中使用
mutate\u all
case\u来管理这一点:

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

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

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

dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
                      rightmost.closed=TRUE) - 1L
数据

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

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

dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
                      rightmost.closed=TRUE) - 1L
数据

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

dat非常好!!!非常感谢你。我非常喜欢这两种方法!!!我可能会坚持使用ifelse版本,因为它非常简单,非常好!!!非常感谢你。我非常喜欢这两种方法!!!我可能会坚持使用ifelse版本,因为它非常简单,非常好,非常感谢lmo。我会把这个添加到我的个人备忘中,以备将来使用。也很好,非常感谢lmo。我将把这个添加到我的个人备忘单中,以备将来使用。