Есть ли цикл, который я могу использовать, чтобы привести в порядок этот код? - PullRequest
0 голосов
/ 31 октября 2018
replace.value(zdata, c(1), DL[1], 0)  
replace.value(zdata, c(2), DL[2], 0)  
replace.value(zdata, c(3), DL[3], 0)  
replace.value(zdata, c(4), DL[4], 0)  
replace.value(zdata, c(5), DL[5], 0)  
replace.value(zdata, c(6), DL[6], 0)  
replace.value(zdata, c(7), DL[7], 0)  
replace.value(zdata, c(8), DL[8], 0)

Мне нужно изменить определенное значение (которое дано в векторе DL) на 0 для каждого столбца кадра данных. Например, первое значение вектора DL равно 0,5, поэтому первая строка кода выше меняет каждые 0,5 в первом столбце кадра данных на 0.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если вы хотите использовать tidyverse более явно, вы можете использовать что-то вроде walk

library(tidyverse)
walk(1:8, ~replace.value(zdata, .x, DL[.x], 0))
0 голосов
/ 31 октября 2018

Да. Давайте сделаем некоторые улучшения. Прежде всего, c() означает сцепление , что означает «склеивать вещи». Если у вас есть только одна вещь, вам не нужно c(). 5 соответствует c(5), "hello" соответствует c("hello") и т. Д.

Цикл for позволяет зацикливать определенные значения. Значения, которые вы изменяете в каждой строке кода, изменяются от 1 до 8, поэтому мы повторим это:

for (val in 1:8) {
  replace.value(zdata, val, DL[val], 0)
}

Я не знаю функцию replace.value (и вы не упоминаете, в каком пакете она находится), но странно, что вы не присваиваете результаты. В базе R вы бы сделали что-то вроде этого:

zdata[1][zdata[1] == DL[1]] <- 0
zdata[2][zdata[2] == DL[2]] <- 0
...

Использование <- для назначения результата, чтобы он был сохранен. Это превратилось бы в цикл for:

for (val in 1:8) {
  zdata[val][zdata[val] == DL[val]] <- 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...