R цикл по столбцам в таблице данных - возможная ошибка setnames ()? - PullRequest
0 голосов
/ 30 августа 2018

Цикл for используется для выбора каждого столбца таблицы данных путем изменения имени столбца на «selcol» с помощью setnames(). В полном коде каждый столбец используется несколько раз для различного числа людей, которые применяют критерии столбца. Затем имя столбца меняется на его первоначальное имя. Здесь, как представляется, возникает ошибка, поскольку setnames() меняет имя столбца в большем количестве мест, чем указанная таблица данных. Кроме того, функция setnames() не меняет имя столбца обратно. Если вместо использования цикла я устанавливаю индекс y = 1, y = 2, ... тогда эта ошибка не возникает; это происходит только при запуске цикла. Я попытался определить временную таблицу, и я попытался определить вектор имен столбцов, но когда я использую setnames() в этих объектах, имя изменяется в постоянной таблице и в векторе имен, которые должны оставаться постоянными. Я попробовал таблицу данных и фрейм данных. Я хотел бы знать, если это ошибка в пакете, и есть ли другой практический способ выбрать каждый столбец?

norows = 5
nocols = 7

mtrx_perm <- as.data.table(matrix(round(rnorm(norows*nocols), digits = 3), ncol = nocols, byrow = T))

colnames(mtrx_perm) <- as.character(seq(0:6)-1)

resetnames <- colnames(mtrx_perm)

vect_temp = rep(0, norows)
for (y in 1: nocols){
mtrx_temp <- mtrx_perm
setnames(mtrx_temp, as.character(y-1), "selcol")
vect_add <- mtrx_temp$selcol
#setnames(mtrx_temp, "selcol", as.character(y-1))
colnames(mtrx_temp) <- resetnames
vect_temp <- vect_temp + vect_add
}

mtrx_perm
mtrx_temp
vect_temp
apply(mtrx_perm, 1, sum)

1 Ответ

0 голосов
/ 30 августа 2018

Я не знаю много о data.table, но, похоже, setnames меняет имена в mtrx_perm и mtrx_temp Я предполагаю, что это как-то связано с тем, как data.table меняет вещи на месте. В любом случае я заменил setnames на colnames, и он отлично работает

library(data.table)
norows = 5
nocols = 7

mtrx_perm <- as.data.table(matrix(round(rnorm(norows*nocols), digits = 3), ncol = nocols, byrow = T))

colnames(mtrx_perm) <- as.character(seq(0:6)-1)

resetnames <- colnames(mtrx_perm)

vect_temp = rep(0, norows)
for (y in 1: nocols){
  mtrx_temp <- mtrx_perm
  colnames(mtrx_temp)[y] <- "selcol"
  vect_add <- mtrx_temp$selcol
  colnames(mtrx_temp) <- resetnames
  vect_temp <- vect_temp + vect_add
}

mtrx_perm
mtrx_temp
vect_temp
apply(mtrx_perm, 1, sum)

Я также не понимаю, почему вы выбираете столбец, изменяя его имя? Почему бы просто не перебрать имена столбцов более прямо? Вы показываете, что знаете лучший способ решения вашего примера с использованием apply, поэтому вы можете создать пример, который показывает, что для вашего варианта использования требуется цикл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...