plumb_r
plumb_r

Reputation: 39

Summarise a group value into single row

I have a large dataset with longitudinal readings from single individuals. I want to summarise information over time into a binary variable. i.e. if diff in the input table below is >5 for any value I want to then reduce the observation for A to a new column saying TRUE.

#Input

individual    val1    val2    diff
A    32    36    -4
A    36    28    8
A    28    26    2
A    26    26    0
B    65    64    1
B    58    59    -1
B    57    54    3
B    54    51    3

#Output

individual    newval
A    TRUE
B    FALSE

Upvotes: 0

Views: 57

Answers (3)

akrun
akrun

Reputation: 887118

An option in base R with rowsum

rowsum(+(df1$diff > 5), df1$individual) != 0

or with by

by(df1$diff > 5, df1$individual, any)

data

df1 <- structure(list(individual = c("A", "A", "A", "A", "B", "B", "B", 
"B"), val1 = c(32L, 36L, 28L, 26L, 65L, 58L, 57L, 54L), val2 = c(36L, 
28L, 26L, 26L, 64L, 59L, 54L, 51L), diff = c(-4L, 8L, 2L, 0L, 
1L, -1L, 3L, 3L)), class = "data.frame", row.names = c(NA, -8L
))

Upvotes: 1

JBGruber
JBGruber

Reputation: 12420

Using dplyr you can:

library(dplyr)

df %>% 
  group_by(individual) %>%          # first group data
  summarize(newval = any(diff > 5)) # then evaluate test for each group
#> # A tibble: 2 x 2
#>   individual newval
#>   <fct>      <lgl> 
#> 1 A          TRUE  
#> 2 B          FALSE

data

df <- read.table(text = "individual    val1    val2    diff
    A    32    36    -4
    A    36    28    8
    A    28    26    2
    A    26    26    0
    B    65    64    1
    B    58    59    -1
    B    57    54    3
    B    54    51    3
    ", header = TRUE)

Upvotes: 2

Ronak Shah
Ronak Shah

Reputation: 388982

Multiple ways to do this :

In base R we can use aggregate

aggregate(diff~individual, df,function(x) any(x>5))

#  individual  diff
#1          A  TRUE
#2          B FALSE

Or tapply

tapply(df$diff > 5, df$individual, any)

We can also use data.table

library(data.table)
setDT(df)[ ,(newval = any(diff > 5)), by = individual]

Upvotes: 2

Related Questions