我如何在R中不使用for循环的情况下编写此指标矩阵

时间:2019-12-19 10:56:10

标签: r loops matrix indicator

我有一个由数字序列给定的因子向量。这些因素也可以在分别称为test_settrain_set的单独数据集中找到。以下代码的作用是发现数据集中的因子在因子向量中的匹配位置,并将1放在矩阵的位置。将此矩阵compound_test乘以test_set$Compound应该会给您compare_comp

compare_comp <- rbind(dcm,cmp1)[,1]
compound_test <- matrix(0,nrow(test_set),length(compare_comp)) # test indicator matrix
compound_train <-matrix(0,nrow(train_set),length(compare_comp))

for (i in 1:length(compare_comp)){
  compound_test[which(compare_comp[i]==test_set$Compound),i]=1
  compound_train[which(compare_comp[i]==train_set$Compound),i]=1}

它是针对训练和测试集执行的,而compare_comp是因子的向量。

R中是否有一个函数可以让我创建相同的东西而无需for循环?我尝试model.matrix(~Compound,data=test_set)时运气不佳。

1 个答案:

答案 0 :(得分:0)

虽然您可能无法完全避免迭代,因为您正在将compare_compCompound中的test_set向量的每个元素与train_set的完整向量进行比较,不过,您可以通过 apply 系列功能使用更紧凑的分配。

具体来说,sapply返回布尔逻辑(TRUEFALSE)的逻辑矩阵,我们在相应位置将其分配给初始化的矩阵,其中TRUE转换为1且{{ 1}}设为0。

FALSE

或者,很少使用且广为人知的# SAPPLY AFTER MATRIX INITIALIZATION compound_test2 <- matrix(0, nrow(test_set), length(compare_comp)) compound_train2 <- matrix(0, nrow(train_set), length(compare_comp)) compound_test2[] <- sapply(compare_comp, function(x) x == test_set$Compound) compound_train2[] <- sapply(compare_comp, function(x) x == train_set$Compound) (类似于vapply,但必须定义输出类型),返回等效矩阵但作为数字类型。

sapply

测试使用随机数据进行确认(请参见下面的演示),两个版本都与循环版本相同

# VAPPLY WITHOUT MATRIX INITIALIZATION
compound_test3 <- vapply(compare_comp, function(x) x == test_set$Compound, 
                         numeric(length(compare_comp)))

compound_train3 <- vapply(compare_comp, function(x) x == train_set$Compound,
                          numeric(length(compare_comp)))

Online Demo