我想建立一个像splitdf(columnA + columnB ~ ., dataframe)
这样它就会为每个可能的columnA and columnB
对返回一个子数据帧列表。它类似于table
或xtabs
所以,对于
> a <- data.frame(x=1:3, y=1:3, z=1:9)
> a
x y z
1 1 1 1
2 2 2 2
3 3 3 3
4 1 1 4
5 2 2 5
6 3 3 6
7 1 1 7
8 2 2 8
9 3 3 9
我期待:
x = 1, y = 1,
x y z
1 1 1
1 1 4
1 1 7
x = 2, y = 2,
x y z
2 2 2
2 2 5
2 2 8
x = 3, y = 3,
x y z
3 3 3
3 3 6
3 3 9
我意识到split
和dlply
可行。但是,它们都没有为我提供操作类别名称的好方法吗?如何让这些名字变得有意义?就像我希望看到x = 1, y = 1
而不是$ 1.1
答案 0 :(得分:5)
这是你想要的吗?
> library (plyr)
> dlply(a, .(x, y))
$`1.1`
x y z
1 1 1 1
2 1 1 4
3 1 1 7
$`2.2`
x y z
1 2 2 2
2 2 2 5
3 2 2 8
$`3.3`
x y z
1 3 3 3
2 3 3 6
3 3 3 9
<强>更新强>
> z <- dlply(a, .(x, y))
> names(z) <- dlply(a, .(x, y), function(x) sprintf("x = %d, y = %d", x$x[1], x$y[1]))
> z
$`x = 1, y = 1`
x y z
1 1 1 1
2 1 1 4
3 1 1 7
$`x = 2, y = 2`
x y z
1 2 2 2
2 2 2 5
3 2 2 8
$`x = 3, y = 3`
x y z
1 3 3 3
2 3 3 6
3 3 3 9
答案 1 :(得分:2)
使用基础split
功能
a <- data.frame(x = 1:3, y = 1:3, z = 1:9)
split(a, f = list(a$x, a$y))
## $`1.1`
## x y z
## 1 1 1 1
## 4 1 1 4
## 7 1 1 7
##
## $`2.1`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`3.1`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`1.2`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`2.2`
## x y z
## 2 2 2 2
## 5 2 2 5
## 8 2 2 8
##
## $`3.2`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`1.3`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`2.3`
## [1] x y z
## <0 rows> (or 0-length row.names)
##
## $`3.3`
## x y z
## 3 3 3 3
## 6 3 3 6
## 9 3 3 9
##