假设我们得到了这个数据帧
X <- data.frame(A = rnorm(11000, sd = 0.8),
B = rnorm(11000, mean = 10, sd = 3),
C = sample( LETTERS[1:24], 11000, replace=TRUE),
D = sample( letters[1:24], 11000, replace=TRUE),
E = round(rnorm(11000,mean=25, sd=3)),
F = round(runif(n = 11000,min = 1000,max = 25000)),
G = round(runif(11000,0,200000)))
我们需要分几次。我们的目标是获得一个类似下面示例的列表:
Acc : Large list (24 elements, XX Mb)
..A:List of XX
.. ..a: List of XX
.. .. ..$ 21: 'data.frame' : XX obs. of 7 variables :
.. .. .. ..$ D: num[1:XX] XXX
.. .. .. ..$ other variables
.. .. ..$ 22: 'data.frame' ...
.. .. ..$ other lists
.. ..b : List of XX
.. ..other Lists
..B: List of XX
..etc...
Acc <- split(X,X$C,drop = TRUE)
Acc <- lapply(Acc, function(x) split(x , x$D, drop = TRUE))
Acc <- lapply(Acc, function(x,c) split(x$c , x$c$E, drop = TRUE))
Acc <- lapply(Acc, function(x,c,f) split(x$c$f, x$c$f$G, drop = TRUE))
最后,我们收到此错误:
Error in split.default(x$c$f, x$c$f$G, drop = TRUE) :
first argument must be a vector
不使用c/f
:
Acc <- split(X,X$C,drop = TRUE)
Acc <- lapply(Acc, function(x) split(x , x$D, drop = TRUE))
Acc <- lapply(Acc, function(x) split(x , x$E, drop = TRUE))
我们得到了
Error in split.default(x, x$E, drop = TRUE) :
group length is 0 but data length > 0
我有一些问题:
1 - 这个错误是由x$c$f
在某些情况下只获得一个元素并且不被视为向量的事实引起的吗? 编辑:经过其他一些测试后,似乎这一点不是问题。
2 - 当我运行我的代码时,在分裂的第三步中我得到的东西似乎是不正确的。它不像上面那样:Acc - A - a - 21
,它看起来像:
Acc : Large list (24 elements, XX Mb)
..A:List of XX
.. ..$ 18:'data.frame'
所以,它不是一个类似于Acc - A - a - 21
的列表,而是Acc - A - 21
。我的问题只是“为什么?”
3 - 是否有比split
/ lapply
更聪明的功能来拆分和拆分列表?
如果有人能提供帮助,我会很高兴。