Суммируйте групповое значение в одну строку - PullRequest
0 голосов
/ 09 ноября 2019

У меня большой набор данных с продольными показаниями от отдельных лиц. Я хочу обобщить информацию с течением времени в двоичную переменную. то есть, если diff в таблице ввода ниже> 5 для любого значения, которое я хочу, тогда уменьшите наблюдение для A до нового столбца, говорящего ИСТИНА.

#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

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

Используя dplyr, вы можете:

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)
2 голосов
/ 09 ноября 2019

Несколько способов сделать это:

В базе R мы можем использовать aggregate

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

#  individual  diff
#1          A  TRUE
#2          B FALSE

Или tapply

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

Мы также можем использоватьdata.table

library(data.table)
setDT(df)[ ,(newval = any(diff > 5)), by = individual]
1 голос
/ 09 ноября 2019

Опция в base R с rowsum

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

или с 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
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...