Упростить кодирование - решение dplyr - PullRequest
0 голосов
/ 25 апреля 2020

Интересно, можно ли упростить мой пример кода?

У меня есть столбец, где каждый элемент должен быть умножен на веса (сохранены в векторе).

Впоследствии я хочу Суммируйте каждую строку.

РЕДАКТИРУЙТЕ два предложения: -):

Думайте, что столбцы 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

Должен быть способ избежать всех столбцов помощи, которые мне на самом деле не нужны.

Спасибо за любую подсказку, чтобы просто ввести мой код.

Оставайтесь здоровый!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...