Как создать функцию, которая в зависимости от условий задерживает вложенную l oop или нет - PullRequest
0 голосов
/ 26 апреля 2020

Мне нужно создать функцию , которая зависит от 2 переменных и таблицы (?) (X, y, table). Сначала этой функции необходимо выполнить l oop через каждую строку в таблице, и в зависимости от значения столбца 'X' (1 или 0) выполнить другое действие:

Когда x column = 1, скопировать строку 'y раз. Затем во вложенном l oop создайте столбец, пронумерованный от 1 до y, сколько раз была скопирована строка.

Когда x column = 0, просто оставьте строку такой, какая она есть.

Пример ввода будет

enter image description here

Выход будет

enter image description here

Я пытался сделать следующий код, но, честно говоря, я не очень хорош с циклами.

    My_function <- function(x,y,table) {

      for (i in 1:nrow(table)) {

        if(table[,which(colnames(table) = as.character(x)] == 1){
          dummy = table[i,]
          final_dummy = NULL

          for(j in 1:dummy$y){
            dummy_2 = dummy
            final_dummy = rbind(final_dummy,dummy_2)
                                                     }
        } else if(table[,which(colnames(table) = as.character(x)] == 0){
              table[i,] 
      }
    }
    }

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы также можете использовать:

library(tidyverse)
df <- tibble(col = c(letters[1:3]), x = c(1, 0, 1), y = c(2, 3, 4))

df %>% 
  mutate(uncY = if_else(x == 0, 1, y)) %>% 
  uncount(uncY, .id = "id")

# A tibble: 7 x 4
  col       x     y    id
  <chr> <dbl> <dbl> <int>
1 a         1     2     1
2 a         1     2     2
3 b         0     3     1
4 c         1     4     1
5 c         1     4     2
6 c         1     4     3
7 c         1     4     4
0 голосов
/ 26 апреля 2020

Вы можете написать функцию как:

My_function <- function(data) {
  out <- data[with(data, rep(seq_along(col), pmax(colx * coly, 1))), ]
  rownames(out) <- NULL
  out$num <- with(out, ave(colx, col, FUN = seq_along))
  return(out)
}

и вызвать ее

My_function(df)

#  col colx coly num
#1   a    1    2   1
#2   a    1    2   2
#3   b    0    3   1
#4   c    1    4   1
#5   c    1    4   2
#6   c    1    4   3
#7   c    1    4   4

data

df <- data.frame(col = letters[1:3], colx = c(1, 0, 1), coly = c(2, 3, 4))
...