Интересно, можно ли упростить мой пример кода?
У меня есть столбец, где каждый элемент должен быть умножен на веса (сохранены в векторе).
Впоследствии я хочу Суммируйте каждую строку.
РЕДАКТИРУЙТЕ два предложения: -):
Думайте, что столбцы id - это дни, столбцы с весом - это ячейки. Вес - это доля живых клеток в последующие дни. Вспомогательные столбцы хранят для всех ячеек идентификатора (день), сколько ячеек еще живут в следующие дни. После длины веса все начальные клетки мертвы.
Цель состоит в том, чтобы рассчитать количество живых клеток на идентификатор (день).
Конец редактирования (лучше понять?)
Может быть, это легче понять с помощью данных:
id <- c(1,2,3,4,5,6,7,8,9,10)
i <- c(1,2,3,1,0,5,7,2,1,1);length(inf)
df<-cbind.data.frame(id,i)
> print(df)
id i
1 1 1
2 2 2
3 3 3
4 4 1
5 5 0
6 6 5
7 7 7
8 8 2
9 9 1
10 10 1
Это мой весовой вектор
weight<-c(1,0.90,0.6,0.1,0);length(weight)
wj = length(weight)
Это первый код, где мне интересно, что это можно упростить (я предпочитаю dplyr решение):
for (k in id){
if (k + wj < dim(df)[1]) {df[paste0("col",k)] <- c(rep(0,k),df$i[k] * weight,rep(df$i[k] * weight[wj],dim(df)[1]-(k+wj)))}
if (k + wj == dim(df)[1]) {df[paste0("col",k)] <- c(rep(0,k),df$i[k] * weight)}
if (k + wj > dim(df)[1] & k < dim(df)[1]) {df[paste0("col",k)] <- c(rep(0,k),df$i[k] * weight[1:(dim(df)[1]-k)])}
if (k == dim(df)[1]) {df[paste0("col",k)] <- rep(0,k)}
}
См. рекурсивный способ данных:
> df
id i col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
1 1 1 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0
2 2 2 1.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0
3 3 3 0.9 2.0 0.0 0.0 0 0.0 0.0 0.0 0 0
4 4 1 0.6 1.8 3.0 0.0 0 0.0 0.0 0.0 0 0
5 5 0 0.1 1.2 2.7 1.0 0 0.0 0.0 0.0 0 0
6 6 5 0.0 0.2 1.8 0.9 0 0.0 0.0 0.0 0 0
7 7 7 0.0 0.0 0.3 0.6 0 5.0 0.0 0.0 0 0
8 8 2 0.0 0.0 0.0 0.1 0 4.5 7.0 0.0 0 0
9 9 1 0.0 0.0 0.0 0.0 0 3.0 6.3 2.0 0 0
10 10 1 0.0 0.0 0.0 0.0 0 0.5 4.2 1.8 1 0
После этого все вспомогательные столбцы, которые я создал с помощью приведенного выше кода, должны быть суммированы в (результат в столбце a) :
df<-df %>% mutate(a = rowSums(.[2:11]))
> df
id i col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 a
1 1 1 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0 1.0
2 2 2 1.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0 3.0
3 3 3 0.9 2.0 0.0 0.0 0 0.0 0.0 0.0 0 0 5.9
4 4 1 0.6 1.8 3.0 0.0 0 0.0 0.0 0.0 0 0 6.4
5 5 0 0.1 1.2 2.7 1.0 0 0.0 0.0 0.0 0 0 5.0
6 6 5 0.0 0.2 1.8 0.9 0 0.0 0.0 0.0 0 0 7.9
7 7 7 0.0 0.0 0.3 0.6 0 5.0 0.0 0.0 0 0 12.9
8 8 2 0.0 0.0 0.0 0.1 0 4.5 7.0 0.0 0 0 13.6
9 9 1 0.0 0.0 0.0 0.0 0 3.0 6.3 2.0 0 0 12.3
10 10 1 0.0 0.0 0.0 0.0 0 0.5 4.2 1.8 1 0 8.5
Должен быть способ избежать всех столбцов помощи, которые мне на самом деле не нужны.
Спасибо за любую подсказку, чтобы просто ввести мой код.
Оставайтесь здоровый!