Обновление
Поскольку значения могут быть не связаны с номером столбца, мы можем создать именованный вектор или поисковый кадр данных, чтобы получить соответствующие значения.
С таблицей поиска:
named_df <- data.frame(col = c(1, 2, 3), value = c(4, 3, 2))
rowSums(df[-1] * named_df$value[col(df[-1])])
#[1] 7 16 16 17
С именованным вектором:
named_vec <- c("1" = 4, "2" = 3, "3" = 2)
rowSums(named_vec[col(df[-1])] * df[-1])
#[1] 7 16 16 17
Логика для обоих подходов одинакова, мы сопоставляем номер столбца с именемnamed_vec
или col
из named_df
и получите соответствующее значение, а затем умножьте его на фактическое значение в кадре данных, а затем возьмите сумму каждой строки, используя rowSums
.
Оригинальный ответ
Вы можете умножить каждое значение в кадре данных на номер его столбца - 1, чтобы получить желаемый результат.Здесь df[-1]
означает игнорирование первого столбца (ID
).
df$result <- rowSums(df[-1] * (col(df) - 1))
df
# ID X1 X2 X3 result
#1 XX 0 1 2 5
#2 YY 1 2 3 8
#3 EE 2 2 1 4
#4 ZZ 0 3 4 11
В целях понимания col(df)
дает
# [,1] [,2] [,3] [,4]
#[1,] 1 2 3 4
#[2,] 1 2 3 4
#[3,] 1 2 3 4
#[4,] 1 2 3 4