2017-08-16 77 views
0

有这样一个数据帧:我如何重新编写许多数据帧列功能相同

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

我要重新编码的Var1Var2,并Var3基础上CriterionVar值的值。在伪代码,这将是这样的:

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)它只是丑陋的。

任何帮助表示赞赏。

+0

是的。编辑。谢谢。 – user1757436

回答

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

DATA

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") 
+1

我想知道如果'df [-1] < - lapply(df [-1],function(i)...)'成语可以在这里用来简单地更新现有的df,从而避免整个'setNames' – Sotos

1

我的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 

在前三行中有一些簿记,但没有太坏。我使用pmin()来限制标准值不大于VarN列的数量。