Как суммировать две строки простым условием в кадре данных - PullRequest
2 голосов
/ 17 февраля 2020

Я хотел бы суммировать строки 2 на 2, чтобы изучить отставание определенной переменной.

Предположим, у меня есть следующая база данных:

> SE eggs
  4  2.0
  6  4.0
  7 10.0
  8  0.5
  5  1.0
  1  3.0
  2  6.0
  3  9.0

Итак Я ожидал получить следующее, где eggs - сумма индексов "SE":

> df
    SE2    eggs
  "4+5"    3
  "6+7"    14
  "8+1"    3.5
  "2+3"    15

, где

df = data.frame(SE=c(4,6,7,8,5,1,2,3),eggs = c(2,4,10,0.5,1,3,6,9))

Обс .: Не имеет значения порядок кадра данных, но мне нужно начать с определенного числа (в данном случае, номер 4), а затем взять следующий номер, в данном случае, номер 5, и сохранить этот лог c. После SE 6 + 7, SE 8 + 1, SE 2 + 3 ...

Любой намек на то, как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Совпадение c(4:8, 1:3) до SE с использованием индексов сопоставления для индексации в eggs, преобразования в матрицу 2x4 и суммирования каждого столбца.

k <- 4   # starting index
nr <- nrow(df)  # no of rows in df

with(df, colSums(matrix(eggs[match(c(k:nr, seq_len(k-1)), SE)], 2)))
## [1] 3.0 14.0  3.5 15.0
2 голосов
/ 17 февраля 2020

Мне кажется, я получаю логи c. Вы хотите, чтобы возрастающие числа начинались с 4. Когда эти числа достигают 8 (или любого другого максимального значения SE), они возвращаются к единице и продолжают подниматься, пока все числа не будут израсходованы.

Затем вы группируете эти числа в последовательные пары.

Для каждой пары чисел вы найдете строки вашего фрейма данных с соответствующими значениями SE. Эти строки содержат два значения яиц, которые вы будете суммировать sh.

df = data.frame(SE=c(4,6,7,8,5,1,2,3),eggs = c(2,4,10,0.5,1,3,6,9))

first <- 4
i <- match(df$SE, c(first:nrow(df), seq(first - 1)))
groups <- ((seq_along(i) + 1) %/% 2)[i]

do.call(rbind, lapply(split(df, groups), function(x) {
  data.frame(SE = paste(x$SE, collapse = "+"), eggs = sum(x$eggs))}))
#>    SE eggs
#> 1 4+5  3.0
#> 2 6+7 14.0
#> 3 8+1  3.5
#> 4 2+3 15.0

Создано в 2020-02-17 пакетом Представления (v0.3.0)

1 голос
/ 18 февраля 2020

Другой вариант, просто небольшое изменение в моем комментарии, где мы переставляем строки в соответствии с указанными логами c, а затем aggregate каждые две строки:

aggregate(
  eggs ~ ceiling(seq_along(SE)/2),
  FUN = sum,
  data = df[with(df, order(factor(SE, levels = c(seq(SE[1], max(SE)), SE[!SE %in% seq(SE[1], max(SE))])))),]
  )[, -1]

[1]  3.0 14.0  3.5 15.0

Или, если вы хотелось бы сохранить SE в указанном формате:

df <- aggregate(
  . ~ ceiling(seq_along(SE)/2),
  FUN = paste, collapse = '+',
  data = df[with(df, order(factor(SE, levels = c(seq(SE[1], max(SE)), SE[!SE %in% seq(SE[1], max(SE))])))),]
  )[, -1]

df$eggs <- sapply(df$eggs, function(x) eval(parse(text = x)))

Вывод:

df

   SE eggs
1 4+5  3.0
2 6+7 14.0
3 8+1  3.5
4 2+3 15.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...