【发布时间】:2019-06-03 02:53:45
【问题描述】:
我有一个类似的矩阵
ID 885038 885039 885040 885041 885042 885043 Class
weights 0 0.005 0 0.018 0 0.007 N/A
1267359 2 0 0 0 0 1 1
1295720 2 0 1 0 0 1 1
1295721 2 0 0 0 0 1 1
1295723 2 0 0 0 0 1 1
1295724 2 0 1 0 1 1 1
我想根据权重从矩阵中一一消除每一列。在每次迭代中,应删除具有最小权重值的列。
Such that iteration 1: 885041,885040,885042 (columns would be removed)
iteration 2: 885039 (removed)
iteration 3: 885043 (removed)
iteration 4: 885041 (removed)
为这个任务编写的代码是
library(readr)
dummy <- read_csv("dummy.csv")
dummy <- t(dummy)
colnames(dummy) <- dummy[1,]
dummy <- dummy[-1,]
for (i in 1:ncol(dummy))
{
min <- as.matrix(which.min(dummy[,1] == min(dummy[,1])))
filter <- row.names(min)
data<- dummy[setdiff(rownames(dummy),filter),]
data <- data[-1,]
print(ncol(data))
}
但是,它给出了一个输出
[1] 6
[1] 6
[1] 6
[1] 6
[1] 6
[1] 6
我想要打印的列数
6
5
4
3
2
有没有办法在这里使用一些应用函数?
【问题讨论】:
-
您提供的矩阵不是很清楚。看起来“类”列应该在行中,所以在转置之后你有一个带有列名的矩阵(ID、权重、1267359、1295720、1295721、1295723、1295724)?无论如何,您在循环中所做的总是用 dummy / t(dummy) 覆盖数据。因此它总是会迭代地返回 6 或 5。
-
@Arno,我更改了代码“data
-
我使用了相同的矩阵和相同的代码,并且得到了相同的输出。 @索托斯。我想我只提供了一个可重现的例子
-
我提供了一个最小的例子。我使用相同的矩阵来运行这段代码,它给了我一系列的六,而不是在每次迭代时减少长度。