R 如何用相同的函数重新编码多个数据帧列

R 如何用相同的函数重新编码多个数据帧列,r,dataframe,recode,R,Dataframe,Recode,我有这样一个数据框: CriterionVar Var1 Var2 Var3 3 0 0 0 1 0 0 0 2 0 0 0 5 0 0 0 for each row if (CriterionVar.value >= Var1.index) Var1 = 1 if (CriterionVar.value >= Var2.index)

我有这样一个数据框:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 
for each row
   if (CriterionVar.value >= Var1.index) Var1 = 1
   if (CriterionVar.value >= Var2.index) Var2 = 1
   if (CriterionVar.value >= Var3.index) Var3 = 1
CriterionVar Var1 Var2 Var3
3            1    1    1
1            1    0    0
2            1    1    0
5            1    1    1
dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1
我想根据
CriterionVar
的值重新编码
Var1
Var2
Var3
的值。在伪代码中,应该是这样的:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 
for each row
   if (CriterionVar.value >= Var1.index) Var1 = 1
   if (CriterionVar.value >= Var2.index) Var2 = 1
   if (CriterionVar.value >= Var3.index) Var3 = 1
CriterionVar Var1 Var2 Var3
3            1    1    1
1            1    0    0
2            1    1    0
5            1    1    1
dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1
重新编码的数据帧如下所示:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 
for each row
   if (CriterionVar.value >= Var1.index) Var1 = 1
   if (CriterionVar.value >= Var2.index) Var2 = 1
   if (CriterionVar.value >= Var3.index) Var3 = 1
CriterionVar Var1 Var2 Var3
3            1    1    1
1            1    0    0
2            1    1    0
5            1    1    1
dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1
显然,这不是完成它的方法,因为(1)VarN列的数量是由一个数据值决定的,(2)它很难看


非常感谢您的帮助。

有关CriterionVar的更多通用值,您可以使用
外部
构建逻辑矩阵,您可以使用该矩阵进行如下索引:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 
for each row
   if (CriterionVar.value >= Var1.index) Var1 = 1
   if (CriterionVar.value >= Var2.index) Var2 = 1
   if (CriterionVar.value >= Var3.index) Var3 = 1
CriterionVar Var1 Var2 Var3
3            1    1    1
1            1    0    0
2            1    1    0
5            1    1    1
dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1

使用
col
返回列索引矩阵的第二种方法更直接一些:

dat[2:4][dat$CriterionVar >= col(dat[-1])] <- 1

dat[2:4][dat$CriterionVar>=col(dat[-1])]对于CriterionVar的更一般的值,您可以使用
outer
来构造逻辑矩阵,您可以使用该矩阵进行如下索引:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 
for each row
   if (CriterionVar.value >= Var1.index) Var1 = 1
   if (CriterionVar.value >= Var2.index) Var2 = 1
   if (CriterionVar.value >= Var3.index) Var3 = 1
CriterionVar Var1 Var2 Var3
3            1    1    1
1            1    0    0
2            1    1    0
5            1    1    1
dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1

使用
col
返回列索引矩阵的第二种方法更直接一些:

dat[2:4][dat$CriterionVar >= col(dat[-1])] <- 1
dat[2:4][dat$CriterionVar>=col(dat[-1])]
数据

df = structure(list(CriterionVar = c(3L, 1L, 2L, 5L), Var1 = c(1, 
1, 1, 1), Var2 = c(1, 0, 1, 1), Var3 = c(1, 0, 0, 1)), .Names = c("CriterionVar", 
"Var1", "Var2", "Var3"), row.names = c(NA, -4L), class = "data.frame")
数据

df = structure(list(CriterionVar = c(3L, 1L, 2L, 5L), Var1 = c(1, 
1, 1, 1), Var2 = c(1, 0, 1, 1), Var3 = c(1, 0, 0, 1)), .Names = c("CriterionVar", 
"Var1", "Var2", "Var3"), row.names = c(NA, -4L), class = "data.frame")

我是vapply的大力支持者:它很快,而且你知道它将返回的形状。唯一的问题是生成的矩阵通常是您想要的“横向”版本。但是
t()
很容易就解决了这个问题

n_var_cols <- 3
truncated_criterion <- pmin(dat[["CriterionVar"]], n_var_cols)
row_template <- rep_len(0, n_var_cols)

replace_up_to_index <- function(index) {
  replace(row_template, seq_len(index), 1)
}

over_matrix <- vapply(
  X         = truncated_criterion,
  FUN       = replace_up_to_index,
  FUN.VALUE = row_template
)
over_matrix <- t(over_matrix)

dat[, -1] <- over_matrix
dat
#   CriterionVar Var1 Var2 Var3
# 1            3    1    1    1
# 2            1    1    0    0
# 3            2    1    1    0
# 4            5    1    1    1

n\u var\u cols我是
vapply
的大力支持者:它速度快,而且你知道它将返回的形状。唯一的问题是生成的矩阵通常是您想要的“横向”版本。但是
t()
很容易就解决了这个问题

n_var_cols <- 3
truncated_criterion <- pmin(dat[["CriterionVar"]], n_var_cols)
row_template <- rep_len(0, n_var_cols)

replace_up_to_index <- function(index) {
  replace(row_template, seq_len(index), 1)
}

over_matrix <- vapply(
  X         = truncated_criterion,
  FUN       = replace_up_to_index,
  FUN.VALUE = row_template
)
over_matrix <- t(over_matrix)

dat[, -1] <- over_matrix
dat
#   CriterionVar Var1 Var2 Var3
# 1            3    1    1    1
# 2            1    1    0    0
# 3            2    1    1    0
# 4            5    1    1    1

n\u var\u cols是的。编辑。谢谢,是的。编辑。谢谢。我想知道
df[-1]我想知道
df[-1]