Более полезная функция для назначения новых номеров - PullRequest
0 голосов
/ 28 апреля 2018

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

В простом примере я могу описать мою проблему следующим образом

df <- data.frame(col=rep(seq(0,3),each=4), row = c(seq(0,3)))

> df
   col row
1    0   0
2    0   1
3    0   2
4    0   3
5    1   0
6    1   1
7    1   2
8    1   3
9    2   0
10   2   1
11   2   2
12   2   3
13   3   0
14   3   1
15   3   2
16   3   3

Я хотел бы создать новый столбец на основе условий в столбцах col и row, чтобы

assign_z <- function(col,row){

    ifelse(col==0&row<=0, 0, #0 is the assigned number to assign_z column
    ifelse(col==0&row>0&row<=2, 1, #1 is the assigned number to assign_z column
    ifelse(col==0&row>=3,2,        #2 is the assigned number to assign_z column

    ifelse(col==1&row<=0,3,        #3 is the assigned number to assign_z column
    ifelse(col==1&row>0&row<=2,4,  #4 is the assigned number to assign_z column
    ifelse(col==1&row>=3,5,        #5 is the assigned number to assign_z column

    ifelse(col==2&row<=0,6,        #6 is the assigned number to assign_z column 
    ifelse(col==2&row>0&row<=2,7,  #7 is the assigned number to assign_z column
    ifelse(col==2&row>=3,8,        #8 is the assigned number to assign_z column


    ifelse(col==3&row<=0,9,        #9 is the assigned number to assign_z column
    ifelse(col==3&row>0&row<=2,10, #10 is the assigned number to assign_z column 
    ifelse(col==3&row>=3,11,NA     #11 is the assigned number to assign_z column

    ))))))))))))

  }    
}

и когда я запускаю свою функцию, я могу получить

library(dplyr)

df%>%
  mutate(assign_z=assign_z(col,row))

   col row assign_z
1    0   0        0
2    0   1        1
3    0   2        1
4    0   3        2
5    1   0        3
6    1   1        4
7    1   2        4
8    1   3        5
9    2   0        6
10   2   1        7
11   2   2        7
12   2   3        8
13   3   0        9
14   3   1       10
15   3   2       10
16   3   3       11

, но функция assign_z будет слишком длинной, поскольку в моих реальных данных у меня есть номер 1000 col. Кроме того, столбец assign_z следует увеличивать таким систематическим образом.

Как сократить функцию, чтобы получить такой же результат, даже если у меня 1000 столбцов?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Это выполняет плотное ранжирование по комбинации col, row, но обрабатывает row = 2 как 1. Я не знаю, чего вы пытаетесь достичь, но оно воспроизводит ваш вывод и будет работать с любым фреймом данных длины:

assign_z <- function(col, row){
  rank_over = paste0(col, ifelse(row == 2, 1, row))
  final_column = dense_rank(rank_over) - 1
  return(final_column)
}


df %>% mutate(assign_z=assign_z(col,row))
# col row assign_z
# 1    0   0        0
# 2    0   1        1
# 3    0   2        1
# 4    0   3        2
# 5    1   0        3
# 6    1   1        4
# 7    1   2        4
# 8    1   3        5
# 9    2   0        6
# 10   2   1        7
# 11   2   2        7
# 12   2   3        8
# 13   3   0        9
# 14   3   1       10
# 15   3   2       10
# 16   3   3       11
0 голосов
/ 28 апреля 2018

Я не использую R, но на основании того, что я вижу, вы не можете использовать глобальный счетчик пожалуйста, прости любые проблемы синтаксиса

    counter <<- 0

    assign_z <- function(col,row){
        #get current value
        returnValue<-counter

        #add to counter if row = 0 or 2 or 3    
        if(row==0|row==2|row==3) { counter <<- counter + 1 }

        #return value before it was incremented
        return(returnValue)
    }

Шаблон выглядит как приращение числа в строке = 0, 2, 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...