R 取消堆叠堆叠的数据框会以不同的顺序取消堆叠列
使用R3.1.0R 取消堆叠堆叠的数据框会以不同的顺序取消堆叠列,r,R,使用R3.1.0 a = as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)}))) b = unstack(stack(a)) # Returns FALSE all(colnames(a) == colnames(b)) 有关堆栈/取消堆栈的文档说,取消堆栈应“反转此[堆栈]操作”。我错过什么了吗?为什么我需要对b列重新排序?你永远不会让我为R文档辩护 stack(…)创建一个包含两列的新数据框,values和
a = as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)})))
b = unstack(stack(a))
# Returns FALSE
all(colnames(a) == colnames(b))
有关堆栈/取消堆栈的文档说,取消堆栈应“反转此[堆栈]操作”。我错过什么了吗?为什么我需要对b列重新排序?你永远不会让我为R文档辩护
stack(…)
创建一个包含两列的新数据框,values
和ind
。后者将原始表中的列名作为一个因子按字母顺序排列unstack(…)
使用该因子(重新)创建新数据框的列。所以“拆垛逆转了这一操作”这句话应该粗略地解释
要获得所需的结果,需要按如下方式重新排列系数ind
:
a <- as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)})))
c <- stack(a)
c$ind <- factor(c$ind, levels=colnames(a))
d <- unstack(c)
identical(a,d)
# [1] TRUE
a你永远不会让我为R文档辩护
stack(…)
创建一个包含两列的新数据框,values
和ind
。后者将原始表中的列名作为一个因子按字母顺序排列unstack(…)
使用该因子(重新)创建新数据框的列。所以“拆垛逆转了这一操作”这句话应该粗略地解释
要获得所需的结果,需要按如下方式重新排列系数ind
:
a <- as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)})))
c <- stack(a)
c$ind <- factor(c$ind, levels=colnames(a))
d <- unstack(c)
identical(a,d)
# [1] TRUE
a你永远不会让我为R文档辩护
stack(…)
创建一个包含两列的新数据框,values
和ind
。后者将原始表中的列名作为一个因子按字母顺序排列unstack(…)
使用该因子(重新)创建新数据框的列。所以“拆垛逆转了这一操作”这句话应该粗略地解释
要获得所需的结果,需要按如下方式重新排列系数ind
:
a <- as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)})))
c <- stack(a)
c$ind <- factor(c$ind, levels=colnames(a))
d <- unstack(c)
identical(a,d)
# [1] TRUE
a你永远不会让我为R文档辩护
stack(…)
创建一个包含两列的新数据框,values
和ind
。后者将原始表中的列名作为一个因子按字母顺序排列unstack(…)
使用该因子(重新)创建新数据框的列。所以“拆垛逆转了这一操作”这句话应该粗略地解释
要获得所需的结果,需要按如下方式重新排列系数ind
:
a <- as.data.frame(do.call(cbind, lapply(1:100, function(x) { c(1,2,3)})))
c <- stack(a)
c$ind <- factor(c$ind, levels=colnames(a))
d <- unstack(c)
identical(a,d)
# [1] TRUE
a堆栈的最后几行
(请参见utils:::stack.data.frame
)函数创建一个包含两列“value”和“ind”的data.frame
。“ind”列使用以下代码创建:
ind = factor(rep.int(names(x), lapply(x, length)))
但是,看看因子
通常是如何工作的(注意“级别”的顺序):
如果您描述的功能对您的分析很重要,您最好修改stack.data.frame
的版本,以便在分解过程中捕获data.frame
名称的顺序,如下所示:
Stack <- function (x, select, ...)
{
if (!missing(select)) {
nl <- as.list(1L:ncol(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
x <- x[, vars, drop = FALSE]
}
keep <- unlist(lapply(x, is.vector))
if (!sum(keep))
stop("no vector columns were selected")
if (!all(keep))
warning("non-vector columns will be ignored")
x <- x[, keep, drop = FALSE]
data.frame(values = unlist(unname(x)),
# REMOVE THIS --> ind = factor(rep.int(names(x), lapply(x, length))),
# AND ADD THIS:
ind = factor(rep.int(names(x), lapply(x, length)), unique(names(x))),
stringsAsFactors = FALSE)
}
stack
(请参见utils:::stack.data.frame
)函数的最后几行创建了一个data.frame
,其中包含两列“value”和“ind”。“ind”列使用以下代码创建:
ind = factor(rep.int(names(x), lapply(x, length)))
但是,看看因子
通常是如何工作的(注意“级别”的顺序):
如果您描述的功能对您的分析很重要,您最好修改stack.data.frame
的版本,以便在分解过程中捕获data.frame
名称的顺序,如下所示:
Stack <- function (x, select, ...)
{
if (!missing(select)) {
nl <- as.list(1L:ncol(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
x <- x[, vars, drop = FALSE]
}
keep <- unlist(lapply(x, is.vector))
if (!sum(keep))
stop("no vector columns were selected")
if (!all(keep))
warning("non-vector columns will be ignored")
x <- x[, keep, drop = FALSE]
data.frame(values = unlist(unname(x)),
# REMOVE THIS --> ind = factor(rep.int(names(x), lapply(x, length))),
# AND ADD THIS:
ind = factor(rep.int(names(x), lapply(x, length)), unique(names(x))),
stringsAsFactors = FALSE)
}
stack
(请参见utils:::stack.data.frame
)函数的最后几行创建了一个data.frame
,其中包含两列“value”和“ind”。“ind”列使用以下代码创建:
ind = factor(rep.int(names(x), lapply(x, length)))
但是,看看因子
通常是如何工作的(注意“级别”的顺序):
如果您描述的功能对您的分析很重要,您最好修改stack.data.frame
的版本,以便在分解过程中捕获data.frame
名称的顺序,如下所示:
Stack <- function (x, select, ...)
{
if (!missing(select)) {
nl <- as.list(1L:ncol(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
x <- x[, vars, drop = FALSE]
}
keep <- unlist(lapply(x, is.vector))
if (!sum(keep))
stop("no vector columns were selected")
if (!all(keep))
warning("non-vector columns will be ignored")
x <- x[, keep, drop = FALSE]
data.frame(values = unlist(unname(x)),
# REMOVE THIS --> ind = factor(rep.int(names(x), lapply(x, length))),
# AND ADD THIS:
ind = factor(rep.int(names(x), lapply(x, length)), unique(names(x))),
stringsAsFactors = FALSE)
}
stack
(请参见utils:::stack.data.frame
)函数的最后几行创建了一个data.frame
,其中包含两列“value”和“ind”。“ind”列使用以下代码创建:
ind = factor(rep.int(names(x), lapply(x, length)))
但是,看看因子
通常是如何工作的(注意“级别”的顺序):
如果您描述的功能对您的分析很重要,您最好修改stack.data.frame
的版本,以便在分解过程中捕获data.frame
名称的顺序,如下所示:
Stack <- function (x, select, ...)
{
if (!missing(select)) {
nl <- as.list(1L:ncol(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
x <- x[, vars, drop = FALSE]
}
keep <- unlist(lapply(x, is.vector))
if (!sum(keep))
stop("no vector columns were selected")
if (!all(keep))
warning("non-vector columns will be ignored")
x <- x[, keep, drop = FALSE]
data.frame(values = unlist(unname(x)),
# REMOVE THIS --> ind = factor(rep.int(names(x), lapply(x, length))),
# AND ADD THIS:
ind = factor(rep.int(names(x), lapply(x, length)), unique(names(x))),
stringsAsFactors = FALSE)
}