我正在尝试修改一个函数,以便如果我放入一个数据框,我会得到行号和行输出。
这些函数取自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"