【发布时间】:2017-06-04 22:43:28
【问题描述】:
想在 R 中创建一个新的数据框,它采用一组行,并以 nrow * nrow * ncol 格式组合每个变体。
library(dplyr)
dat <- read.table(text =
" Animal Color Size
Cat Orange 10
Dog Black 20", header=TRUE)
想要这个输出:
Animal Color Size
Cat NA NA
Cat Orange NA
Cat Orange 10
Dog NA NA
Dog Black NA
Dog Black 20
R 中是否有一个函数可以做到这一点——比如expand.grid?
expand.grid(dat$Animal, dat$Color, dat$Size) %>% arrange(Var1, Var2, Var3) #Note: this does not give the correct answer.
我可以使用以下方法创建 dat 第一行的第一块:
dat <- c("Cat", "Orange", 10)
counter <- 1
datInner <- list()
for(i in 1:length(dat)){ # loops through 3x
# i <- 3
datInner[[i]] <- dat[1:i]
counter <- counter + 1
}
library(plyr)
# Adapted from http://stackoverflow.com/questions/17308551/do-callrbind-list-for-uneven-number-of-column
plyr::rbind.fill(lapply(datInner, function(y){as.data.frame(t(y),
stringsAsFactors = FALSE)}))
# V1 V2 V3
# 1 Cat <NA> <NA>
# 2 Cat Orange <NA>
# 3 Cat Orange 10
注意:将此函数类型称为序列树扩展矩阵 (STEM)。它采用一个包含节点深度不同的树的表,仅列出结束节点,并将其转换为包含树的所有顺序组合的表。
【问题讨论】:
-
NAs 来自哪里?expand.grid不插入NAs。 -
NA 只是占位符
-
为什么
Animal列中没有NAs? -
为什么没有
Cat NA 10行? -
@Gregor 因为顺序性(从左到右)。