根据列名中的匹配值和R中的特定列创建0-1数据帧

我想根据列名的匹配值/类和另一列中给出的信息重新填充数据框.

这是一个假设的数据帧:

> mat.data = data.frame(A = c(rep(1,2),rep(0,2)), B = c(0,rep(1,2),0) , 
+                       C = rep(0,4), D = c(rep(0,3),1), cat = c(rep("A",2),"C","B"))
> mat.data
 A B C D cat
 1 0 0 0   A
 1 1 0 0   A
 0 1 0 0   C
 0 0 0 1   B 

我以某种方式设法通过使用匹配函数提取匹配值(例如匹配(mat.data [,5],colnames(mat.data [1:4]))).但是,我无法在合理的时间内获得我想要的输出.

我想根据数据的列名和第5列之间的真实匹配重新填充0-1值(所以当第5列是给定行的A时,我希望在名为“”的列下面为“1”一个“,”和其他人的“0”.

为了更好的解释,所需的输出是:

> mat.data
 A B C D cat
 1 0 0 0   A
 1 0 0 0   A
 0 0 1 0   C
 0 1 0 0   B 

任何使其清洁和不那么复杂的建议都会很棒.

最佳答案
一种可能的方法是使用model.matrix重新创建矩阵,但首先确保cat变量具有与原始矩阵的列名对应的级别:

mat.data$cat <- factor(mat.data$cat, levels = head(names(mat.data), -1))
new.mat <- data.frame(model.matrix( ~  mat.data$cat - 1))
names(new.mat) <- levels(mat.data$cat)

new.mat
  A B C D
1 1 0 0 0
2 1 0 0 0
3 0 0 1 0
4 0 1 0 0

转载注明原文:根据列名中的匹配值和R中的特定列创建0-1数据帧 - 代码日志