0

我正在尝试修改一个函数,以便如果我放入一个数据框,我会得到行号和行输出。

这些函数取自Zip 还是在 R 中枚举?对我来说是一个很好的起点:

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

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

当输入是数据框时,我修改了 enumerate 以按我的意愿工作:

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

例如:

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

这将枚举数据框的行,所以我可以这样做:

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

问题是我收到警告:

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

另外,我希望数据框仍然是一个数据框,这样我就可以执行 i$v$b 之类的操作,以从数据框中返回 i$k 列 b 的值。

如何摆脱警告,拆分后如何保留数据框结构?

编辑:

示例 1 - 数据帧输入输出:

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

示例 2 - 列出输入输出:

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

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


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

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

0 回答 0