数据帧的子集

时间:2013-09-01 13:22:12

标签: r dataframe subset

我有一个带有R条目的数据框,并希望从该数据框中创建所有可能的唯一子集,此时每个子集应包含原始数据帧中列池中两列的唯一可能的成对组合。这意味着如果原始数据帧中的列数是Y,则我应该得到的唯一子集的数量是Y *(Y-1)/ 2。我还希望每个子集中列的名称是原始数据框中使用的名称。我该怎么做?

2 个答案:

答案 0 :(得分:0)

colpairs <- function(d) {
  apply(combn(ncol(d),2), 2, function(x) d[,x])
}

x <- colpairs(iris)
sapply(x, head, n=2)

## [[1]]
##   Sepal.Length Sepal.Width
## 1          5.1         3.5
## 2          4.9         3.0
## 
## [[2]]
##   Sepal.Length Petal.Length
## 1          5.1          1.4
## 2          4.9          1.4
...

答案 1 :(得分:0)

我使用combn制作列的索引,lapply使用data.frame的子集并将其存储在list结构中。 e.g。

#  Example data
set.seed(1)
df <- data.frame( a = sample(2,4,repl=T) ,
            b = runif(4) ,
            c = sample(letters ,4 ),
            d = sample( LETTERS , 4 ) )

# Use combn to get indices
ind <- combn( x = 1:ncol(df) , m = 2  , simplify = FALSE )

#  ind is the column indices. The indices returned by the example above are (pairs in columns):     
#[,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    2    2    3
#[2,]    2    3    4    3    4    4

#  Make subsets, combine in list
out <- lapply( ind , function(x) df[,x] )
[[1]]
#  a         b
#1 1 0.2016819
#2 1 0.8983897
#3 2 0.9446753
#4 2 0.6607978

[[2]]
#  a c
#1 1 q
#2 1 b
#3 2 e
#4 2 x

[[3]]
#  a d
#1 1 R
#2 1 J
#3 2 S
#4 2 L

[[4]]
#          b c
#1 0.2016819 q
#2 0.8983897 b
#3 0.9446753 e
#4 0.6607978 x

[[5]]
#          b d
#1 0.2016819 R
#2 0.8983897 J
#3 0.9446753 S
#4 0.6607978 L

[[6]]
#  c d
#1 q R
#2 b J
#3 e S
#4 x L