Удаление минимального значения рекурсивно из матрицы с использованием цикла в R - PullRequest
0 голосов
/ 08 января 2019

У меня есть матрица, как

 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

Есть ли способ использовать некоторые функции здесь?

1 Ответ

0 голосов
/ 08 января 2019

Ваши данные выглядят как матрица строк. Вам нужно конвертировать их в числовые. Воспроизводимый пример был бы хорош, как просил вас Сотос. Мы не можем узнать из вашего способа предоставления примера, является ли ваш тип данных строковым или числовым.

# 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...