Цикл R не выполняет цикл правильное количество раз

#r

#r

Вопрос:

Мой DF содержит 9 столбцов, 3 набора по 3. В общей строке, которую я пытаюсь создать, я суммирую первый столбец, суммирую второй столбец и делю в третьем столбце. Повторите для второго набора и повторите для третьего набора. За исключением того, что мой цикл не работает. Он правильно вычисляет количество наборов, 3, но выполняет цикл только дважды. Мои результаты суммируются для первых 6 столбцов / первых 2 наборов.

 df <- data.frame(a=c(200,200,200),b=c(20,20,20),c=c(10,10,10),d=c(100,100,100),e=c(2,2,2),f=c(50,50,50),g=c(200,200,200),h=c(20,20,20),i=c(10,10,10))

i <- 1
totals <- vector()

for (sets in (range(1:length(df))/3)){
  x <- colSums(df[i:i], na.rm = TRUE)
  i <- i   1
  y <- colSums(df[i:i], na.rm = TRUE)
  i <- i   1
  z <- x/y
  i <- i   1
  totals <- c(totals,x,y,z)
}

totals <- c(0,totals)
print(totals)
  

Комментарии:

1. Какие значения вы хотите sets принять? 1:length(df) есть 1, 2, 3, ..., 8, 9 . range(1:length(df)) является 1, 9 , потому range() что возвращает минимальное и максимальное значение. Затем вы делите на 3, так что вы получаете .3333, 3 . Итак, вы запрашиваете R для 2 итераций, одну с sets = 0.3333 и одну с sets = 1 . Возможно, вы хотите удалить range() , чтобы сохранить все значения?

2. Затем, что удивительно, вы вообще не используете sets цикл внутри цикла, вместо этого сохраняя отдельный трек i переменной… не уверен, что с этим происходит. Вы выполняете цикл sets , поэтому вам почти наверняка следует использовать sets внутри цикла.

3. Наконец, вы используете df[i:i] пару раз в цикле. Последовательность от i до i будет просто i … так что это эквивалентно df[i]

4. Было бы очень полезно, если бы вы могли опубликовать ожидаемые результаты для вашего образца ввода. Вы хотите (sum(df$a) sum(df$b)) / sum(df$c) , и аналогично для групп столбцов d, e, f и g, h, i ?

5. Чтобы ответить на некоторые вопросы: я пытаюсь перебирать наборы столбцов. Набор столбцов состоит из 3 столбцов. первый столбец набора, который я хочу суммировать, второй столбец набора, который я хочу суммировать, и третий столбец набора, который я хочу разделить. в таблице всегда будут столбцы 1,2,3, относящиеся друг к другу. 4,5,6, принадлежащие друг другу, и 7,8,9, принадлежащие друг другу. переменная i предназначена для того, чтобы я знал, на каком сервере я сейчас нахожусь.

Ответ №1:

Как упоминалось в комментариях, ваше начинание выглядит не очень логичным с точки зрения того, как все должно быть сделано … во всяком случае, если я правильно понял вашу проблему, возможными решениями было бы следующее:

 df <- data.frame(a=c(200,200,200),b=c(20,20,20),c=c(10,10,10),d=c(100,100,100),e=c(2,2,2),f=c(50,50,50),g=c(200,200,200),h=c(20,20,20),i=c(10,10,10))


i <- 1
totals <- vector()

for (sets in 1:nrow(df)){
   x <- colSums(df[i:i], na.rm = TRUE)
   i <- i   1
   y <- colSums(df[i:i], na.rm = TRUE)
   i <- i   1
   z <- x/y
   i <- i   1
   totals <- c(totals,x,y,z)
}

totals <- c(0,totals)
print(totals)