如何使用相同的函数重新编码许多数据框列

时间:2017-08-16 19:25:45

标签: r dataframe recode

我有一个这样的数据框:

CriterionVar Var1 Var2 Var3
3            0    0    0
1            0    0    0
2            0    0    0
5            0    0    0 

我想根据Var1的值重新编码Var2Var3CriterionVar的值。在伪代码中,它将是这样的:

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

显然,这不是完成它的方法,因为(1)VarN列的数量由数据值决定,(2)它只是丑陋。

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

对于CriterionVar的更一般值,您可以使用outer构建一个逻辑矩阵,您可以将其用于索引:

dat[2:4][outer(dat$CriterionVar, seq_along(names(dat)[-1]), ">=")] <- 1

在此示例中,返回

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

使用col的第二种方法,它返回列索引的矩阵,有点直接:

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

并返回所需的结果。

数据

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

答案 1 :(得分:2)

df[,-1] = lapply(2:NCOL(df), function(i) as.numeric(df[,1] >= (i-1)))
df
#  CriterionVar Var1 Var2 Var3
#1            3    1    1    1
#2            1    1    0    0
#3            2    1    1    0
#4            5    1    1    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")

答案 2 :(得分:1)

我是vapply的忠实支持者:它很快,你知道它会回归的形状。唯一的问题是产生的矩阵通常是横向的&#34;你想要的版本。但是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

在前三行中有一些簿记,但没什么不好。我使用pmin()将条件值限制为不大于VarN列的数量。