Агрегирование с использованием функции diff с непоследовательными строками - PullRequest
1 голос
/ 06 апреля 2020

Я довольно новичок в r и сам учу себя, как его использовать, так что, надеюсь, я смогу хорошо объяснить свой вопрос.

В моих данных есть 4 столбца:

1. Code=Location of a plot
2. Event= Pre or Post. Refers to whether the year of sampling was before or after a disturbance
3. Season= The season the sampling was done in
4. Total= Number of individuals found in plot

Я хотел бы объединить данные так, чтобы у меня была одна строка для каждого местоположения и сезона, которая содержит общее изменение между до и после fire.

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

Что у меня есть:

Code   Event Season Total
A      Post  AUTUMN     2
A      Pre   AUTUMN     5
A      Pre   SUMMER    15
A      Post  SUMMER    40
B      Pre   AUTUMN     5
B      Post  AUTUMN     8

Что бы я хотел иметь:

Code   Season   Change
A      AUTUMN        3
A      SUMMER      -25
B      AUTUMN       -3

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Мы можем использовать diff в «Всего» после группировки по «Коду» и «Сезону»

aggregate(cbind(Change = Total) ~ Code + Season, df1, diff)

Или с dplyr

library(dplyr)
df1 %>%
   group_by(Code, Season) %>%
   summarise(Change = Total[Event == "Pre"] - Total[Event == "Post"])
# A tibble: 3 x 3
# Groups:   Code [2]
#  Code  Season Change
#  <chr> <chr>   <int>
#1 A     AUTUMN      3
#2 A     SUMMER    -25
#3 B     AUTUMN     -3

Или используя data.table

library(data.table)
setDT(df1)[, .(Change = Total[Event == 'Pre'] - Total[Event == 'Post']), .(Code, Season)]

data

df1 <- structure(list(Code = c("A", "A", "A", "A", "B", "B"), Event = c("Post", 
"Pre", "Pre", "Post", "Pre", "Post"), Season = c("AUTUMN", "AUTUMN", 
"SUMMER", "SUMMER", "AUTUMN", "AUTUMN"), Total = c(2L, 5L, 15L, 
40L, 5L, 8L)), class = "data.frame", row.names = c(NA, -6L))
2 голосов
/ 06 апреля 2020

Вот базовая опция R

dfout <- aggregate(Change~Code + Season,
                   transform(df,Change = Total*ifelse(Event=="Post",-1,1)),
                   sum)

, которая дает

> dfout
  Code Season Change
1    A AUTUMN      3
2    B AUTUMN     -3
3    A SUMMER    -25

ДАННЫЕ

df <- structure(list(Code = c("A", "A", "A", "A", "B", "B"), Event = c("Post", 
"Pre", "Pre", "Post", "Pre", "Post"), Season = c("AUTUMN", "AUTUMN", 
"SUMMER", "SUMMER", "AUTUMN", "AUTUMN"), Total = c(2L, 5L, 15L, 
40L, 5L, 8L)), class = "data.frame", row.names = c(NA, -6L))
...