#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)