помечать строки в группах с несколькими условиями - PullRequest
0 голосов
/ 06 сентября 2018

Я смотрел здесь и в других местах, но я не могу найти что-то, что делает именно то, что я хочу достичь, используя R.

У меня есть данные, аналогичные приведенным ниже, где col1 - уникальный идентификатор, col2 - переменная идентификатора группы, col3 - код состояния. Мне нужно пометить все строки с одним и тем же идентификатором группы, и где любая из этих строк имеет определенный код состояния, в данном случае X, как == 1, в противном случае 0.

ID   GroupID    Status   Flag
 1    100        A        1
 2    100        X        1
 3    102        A        0
 4    102        B        0
 5    103        B        1 
 6    103        X        1
 7    104        X        1
 8    104        X        1
 9    105        A        0
 10   105        C        0

Я попытался написать несколько ifelse, где groupID == groupID и status == X, затем 1, иначе 0, но это не работает. Шаблон статуса является случайным. В этом примере GroupID состоит исключительно из пар, но я не хочу предполагать, что в коде b / c у меня есть другой экземпляр, где в GroupID есть 3 или более строк.

Было бы полезно, если бы это был открытый IE, я мог бы добавить другие условия, если необходимо, например, для каждого соответствующего идентификатора группы, где Status == X, и т. Д., И т. Д.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 06 сентября 2018

A base R опция с rowsum

i1 <- with(df1, rowsum(+(Status == "X"), group = GroupID) > 0)
transform(df1, Flag = +(GroupID %in% row.names(i1)[i1]))

Или с использованием table

df1$Flag <- +(with(df1, GroupID %in% names(which(table(GroupID,
                  Status == "X")[,2]> 0))))
0 голосов
/ 06 сентября 2018

Альтернативное использование data.table

library(data.table)
dt <- read.table(stringsAsFactors = FALSE,text = "ID   GroupID    Status
                 1    100        A
                 2    100        X
                 3    102        A
                 4    102        B
                 5    103        B 
                 6    103        X
                 7    104        X
                 8    104        X
                 9    105        A
                 10   105        C", header=T)
setDT(dt)[,.(ID,Status, Flag=ifelse("X"%in% Status,1,0)),by=GroupID]

#returns
   GroupID ID Status Flag
 1:     100  1      A    1
 2:     100  2      X    1
 3:     102  3      A    0
 4:     102  4      B    0
 5:     103  5      B    1
 6:     103  6      X    1
 7:     104  7      X    1
 8:     104  8      X    1
 9:     105  9      A    0
10:     105 10      C    0
0 голосов
/ 06 сентября 2018

Data.table way:

library(data.table)
setDT(df)

df[ , flag := sum(Status == "X") > 0, by=GroupID]
0 голосов
/ 06 сентября 2018

от базы R

ave(df$Status=='X',df$GroupID,FUN=any)
 [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
0 голосов
/ 06 сентября 2018

Групповые операции, подобные этой, легко выполнить с пакетом dplyr .

Данные:

library(dplyr)

txt <- 'ID   GroupID    Status
1    100        A        
2    100        X        
3    102        A        
4    102        B        
5    103        B         
6    103        X        
7    104        X        
8    104        X        
9    105        A        
10   105        C        '

df <- read.table(text = txt, header = T)

Получив фрейм данных, мыустановить группы dplyr с помощью функции group_by.Затем команда mutate будет применяться к каждой группе, создавая новую запись в столбце для каждой строки.

df.new <- df %>% 
  group_by(GroupID) %>% 
  mutate(Flag = as.numeric(any(Status == 'X')))

# A tibble: 10 x 4
# Groups:   GroupID [5]
      ID GroupID Status  Flag
   <int>   <int> <fct>  <dbl>
 1     1     100 A          1
 2     2     100 X          1
 3     3     102 A          0
 4     4     102 B          0
 5     5     103 B          1
 6     6     103 X          1
 7     7     104 X          1
 8     8     104 X          1
 9     9     105 A          0
10    10     105 C          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...