Запись суммирования цикла for в R

Я создаю вектор vsum с длиной, равной длине столбца в фрейме данных, df. Значения в каждом элементе vsum равны сумме строк из определенных столбцов в df, умноженных на элемент в векторе wts. В настоящее время я использую циклы for для достижения результата. Есть ли лучший способ сделать это с помощью векторизованного кода или какой-либо другой базовой функции R?

vsum  <- vector(mode = "numeric", length = 1000)
wts <- vector(mode = "numeric", length = 4)
df <- data.frame(v1=numeric(),v2=numeric(), ... , v50=numeric())

# Values added to wts and df.  1000 rows in df.

cols <- c(3,14,25,36)

for (j in 1:4){
  vsum <- vsum + wts[j]*df[,cols[j]]
}

То, что вы описываете, это простое умножение матриц. Превратите data.frame в матрицу, а затем используйте% *%.

Roland 16.08.2018 20:22

Большое спасибо, Роланд. Я смог воспроизвести свои ожидаемые результаты с% *%. Спасибо за помощь новичку в R!

RHoff 18.08.2018 17:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Опция 1:

rowSums( df[ , cols] * matrix(wts, nrow=nrow(df), byrow=TRUE) )
  • Вычтите столбцы col из df и обработайте их как матрицу A
  • Создайте матрицу B того же размера, что и A, но заполните ее wts по строкам.
  • Затем возьмите строки A * B

Вариант 2:

df[ , col[1]]*wts[1] + ... + df[ , col[4]]*wts[4]
  • Просто умножьте первый столбец в col на первое значение в wts.
  • Повторите для всех столбцов и сложите их.

Спасибо, Дэн Ю. Мне удалось воспроизвести мои циклы for с помощью следующих ... rowSums (df [, cols] * matrix (wts, nrow = nrow (df), ncol = length (wts), byrow = TRUE))

RHoff 17.08.2018 04:27

У меня сейчас недостаточно репутации, чтобы засчитать мой голос "за". Я очень ценю, что вы помогаете новичку в R. :)

RHoff 18.08.2018 17:27

Другие вопросы по теме