0

I'm trying to modify a function so that if I put in a dataframe, I get the rownumber and row output.

These functions taken from Zip or enumerate in R? are a good starting point for me:

zip <- function(...) {
  mapply(list, ..., SIMPLIFY = FALSE)
}

enumerate <- function(...) {
  zip(k=seq_along(..1), ...)
}

I modified enumerate to work as I want when the input is a dataframe:

enumerate2 <- function(...){
    mod <- ..1
    if(is.data.frame(mod)){
        mod = split(mod, seq(nrow(mod)))
    }
    
   zip(k = seq_along(mod), ...)
}

So for example:

g = data.frame(a = c(1, 2, 3), b = c(4, 5, 6))
enumerate2(v = g)

This will enumerate the rows of a dataframe, so I can do:

for(i in enumerate2(v = g)){
    "rowNumber = %s, rowValues = %s" %>% sprintf(i$k, list(i$v)) %>% print
}

The problem is I get a warning:

Warning message:
In mapply(list, ..., SIMPLIFY = FALSE) :
  longer argument not a multiple of length of shorter

Also, I'd rather the dataframe still be a dataframe so that I can do things like i$v$b to return the value of row i$k column b from the dataframe.

How can I get rid of the warning, and how can I keep the dataframe structure after split?

edit:

example 1 - data frame input output:

enumerate2(v = data.frame(A = c(1, 2), B = c(3, 4)))
[[1]]
[[1]]$k
[1] 1

[[1]]$v
  A B
1 1 3


[[2]]
[[2]]$k
[1] 2

[[2]]$v
  A B
1 2 4

example 2 - list input output:

enumerate2(v = LETTERS[1:2])
[[1]]
[[1]]$k
[1] 1

[[1]]$v
[1] "A"


[[2]]
[[2]]$k
[1] 2

[[2]]$v
[1] "B"
Frank
  • 952
  • 1
  • 9
  • 23

0 Answers0