【问题标题】:Deleting the minimum value recursively from a matrix using a loop in R使用R中的循环从矩阵中递归删除最小值
【发布时间】: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
  • 我使用了相同的矩阵和相同的代码,并且得到了相同的输出。 @索托斯。我想我只提供了一个可重现的例子
  • 我提供了一个最小的例子。我使用相同的矩阵来运行这段代码,它给了我一系列的六,而不是在每次迭代时减少长度。

标签: r loops recursion


【解决方案1】:

您的数据似乎是一个字符串矩阵。您需要将它们转换为数字。 正如索托斯问你的那样,一个可重复的例子会很好。我们无法通过您提供示例的方式知道您的数据类型是字符串还是数字。

# reproduce your data for you
df = data.frame(matrix(data=
  c("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), 
  ncol = 8, byrow = TRUE
), stringsAsFactors = FALSE)
colnames(df) = c("ID","885038",  "885039",  "885040",  "885041",  "885042",  "885043",  "Class")
df2 = df[, !colnames(df)%in%c("Class")]

# dummy <- read_csv("dummy.csv")
dummy = df2
dummy <- t(dummy)
colnames(dummy) <- dummy[1,]
dummy <- dummy[-1,]

# "dummy" is a matrix of string. You need a data.frame of numeric.
#        weights 1267359 1295720 1295721 1295723 1295724
# 885038 "0"     "2"     "2"     "2"     "2"     "2"    
# 885039 "0.005" "0"     "0"     "0"     "0"     "0"    
# 885040 "0"     "0"     "1"     "0"     "0"     "1"    
# 885041 "0.018" "0"     "0"     "0"     "0"     "0"    
# 885042 "0"     "0"     "0"     "0"     "0"     "1"    
# 885043 "0.007" "1"     "1"     "1"     "1"     "1"   

class(dummy) # [1] "matrix"
dummy = data.frame(dummy)
dummy$weights = as.numeric(as.character( dummy$weights))
class(dummy$weights) # [1] "numeric"

data = dummy
for (i in 1:ncol(dummy))
{
  rowMin = which.min(data$weights)
  print(paste(nrow(data),rownames(data)[rowMin]))
  data = data[-rowMin,]
}

# [1] "6 885038"
# [1] "5 885040"
# [1] "4 885042"
# [1] "3 885039"
# [1] "2 885043"
# [1] "1 885041"

【讨论】:

  • 谢谢@Stok。但在第一次迭代时,最小权重有 885038、885040 和 885042 三个
猜你喜欢
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2012-02-21
  • 2021-05-24
相关资源
最近更新 更多