DF<-data.frame(id=c(1,1,1,2,2,2),rank=c("1","2","3","1","2","3"),code=c("A","B","B","B","B","A"))

DF
  id rank code
1  A1    1    A
2  A1    2    B
3  A1    3    B
4  B2    1    B
5  B2    2    B
6  B2    3    A

Пожеланная выходная мощность:

  id rank code type1 type2 type3
1  A1    1    A    aa   MIX   MIX
2  A1    2    B    NA   MIX   MIX
3  A1    3    B    NA    NA   MIX
4  B2    1    B    bb    bb   MIX
5  B2    2    B    NA    bb   MIX
6  B2    3    A    NA    NA   MIX

Все сгруппированы по id

type1 получает code, где rank = 1.

type2 получает code, где rank = 1-2. Если code отличается в rank 1 и 2, то MIX

type3 получает code, где rank = 1-3. и т. д. и т. д.

Кто угодно? :)

r
1
hkolvs 9 Окт 2021 в 19:50

2 ответа

Лучший ответ

Если столбец 'code' равен factor, преобразуйте его в character с помощью as.character или используйте type.convert (автоматически), затем сгруппируйте по 'id', создайте условия с помощью case_when для создания столбцов 'type1', 'type2' и 'type3'

library(dplyr)
DF %>%
    type.convert(as.is = TRUE) %>% 
    group_by(id) %>% 
    mutate(type1 = case_when(rank == 1 
                ~ strrep(tolower(code), 2)), 
           type2 = case_when(rank %in% 1:2  &
           n_distinct(code[rank %in% 1:2]) == 1 ~ 
                 strrep(tolower(code), 2),
          rank %in% 1:2  & n_distinct(code[rank %in% 1:2]) > 1 ~ 
        "MIX"), type3 = case_when(rank %in% 1:3 ~ "MIX")) %>% 
    ungroup
# A tibble: 6 × 6
     id  rank code  type1 type2 type3
  <int> <int> <chr> <chr> <chr> <chr>
1     1     1 A     aa    MIX   MIX  
2     1     2 B     <NA>  MIX   MIX  
3     1     3 B     <NA>  <NA>  MIX  
4     2     1 B     bb    bb    MIX  
5     2     2 B     <NA>  bb    MIX  
6     2     3 A     <NA>  <NA>  MIX  

1
akrun 9 Окт 2021 в 18:09

С небольшим изменением моего ответа на ваш предыдущий вопрос

maxtype=3

do.call(
  rbind,
  by(DF,list(DF$id),function(x){
    y=list()
    for (i in 1:maxtype) {
      tmp=rep(NA,nrow(x))
      idx=as.numeric(x$rank)<=i
      if (length(unique(x$code[idx]))==1) {
        tmp[idx]=paste0(rep(tolower(x$code[1]),2),collapse="")
      } else {
        tmp[idx]="MIX"
      }
      y[[paste0("type",i)]]=tmp
    }
    cbind(x,y)
  })
)

    id rank code type1 type2 type3
1.1  1    1    A    aa   MIX   MIX
1.2  1    2    B  <NA>   MIX   MIX
1.3  1    3    B  <NA>  <NA>   MIX
2.4  2    1    B    bb    bb   MIX
2.5  2    2    B  <NA>    bb   MIX
2.6  2    3    A  <NA>  <NA>   MIX

Также обратите внимание, что ваш столбец id отличается в DF и вашем выводе.

0
user2974951 9 Окт 2021 в 17:02