R сумма вектора, умноженная на каждую строку кадра данных - PullRequest
0 голосов
/ 30 марта 2020

У меня есть фрейм данных df следующим образом:

    prod sd  c1   c2   c3
1   NA   NA 0.5 0.25 0.25
2   NA   NA 0.5 0.50 0.00
3   NA   NA 0.5 0.00 0.50

И вектор v = c(0.1, 0.2, 0.3).

Для каждой строки я хочу "sumproduct" df$[,c(3:5)] * v и поместите результат в df$prod, такой что:

df$prod[1] <- (0.5 * 0.1) + (0.25 * 0.2) + (0.25 * 0.3)
df$prod[2] <- (0.5 * 0.1) + (0.5 * 0.2) + (0 * 0.3)

Я прочитал несколько разных потоков о репликации функции sumproduct в Excels и пробовал кучу разных вещей, но я не был в состоянии придумать рабочее решение. Рад сообщить, что не сработало, если это полезно, но я подозреваю, что упускаю из виду нечто очень простое. Любая помощь высоко ценится.

Ответы [ 4 ]

5 голосов
/ 30 марта 2020

Использование умножения матриц:

df$prod <- as.matrix(df[3:5]) %*% v
   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50

Воспроизводимые данные (укажите их в следующий раз):

v <- c(0.1, 0.2, 0.3)

df <- read.csv(text =
"prod,sd,c1,c2,c3
NA,NA,0.5,0.25,0.25
NA,NA,0.5,0.50,0.00
NA,NA,0.5,0.00,0.50")
1 голос
/ 30 марта 2020

Использование apply:

df$prod <- apply(df[,3:5], 1, function(x) sum(x*v))

df
   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50
0 голосов
/ 30 марта 2020

Вы также можете решить это следующим образом:

df$prod <- colSums(t(df[, 3:5]) * v)

#    prod sd  c1   c2   c3
# 1 0.175 NA 0.5 0.25 0.25
# 2 0.150 NA 0.5 0.50 0.00
# 3 0.200 NA 0.5 0.00 0.50

Данные

df <- read.table(text = "    prod sd  c1   c2   c3
1   NA   NA 0.5 0.25 0.25
2   NA   NA 0.5 0.50 0.00
3   NA   NA 0.5 0.00 0.50", header=T)
0 голосов
/ 30 марта 2020

Попробуйте:

transform(df, prod = rowSums(sweep(df[, 3:5], 2, v, `*`)))

Вывод:

   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50
...