如何创建嵌套数据框架

时间:2011-01-31 09:53:01

标签: list r dataframe

我的数据看起来像这样。

> file1="dat1.tab"
> file2="dat2.tab"
> dat1<-read.table(file1)
> print(dat1)
 V1 V2
1  1 43
2  1 43
3  1 43
>
> dat2<-read.table(file2)
> print(dat2)
 V1 V2
1  1 43
2  1 21
3  1 43
4  1 43
5  1 24
6  0 24
>

列V1表示标签,V2表示预测得分。

如何创建一个名为HIV的数据结构,如下所示:

> HIV
$hiv.dat1
$hiv.dat1$predictions
$hiv.dat1$predictions[[1]]
[1] 43 43 43
$hiv.dat$labels
$hiv.dat$labels[[1]]
[1] 1 1 1

$hiv.dat2
$hiv.dat2$predictions
$hiv.dat$predictions[[1]]
[1] 43 21 43 43 24 24
$hiv.dat2$labels
$hiv.dat2$labels[[1]]
[1] 1 1 1 1 1 0

2 个答案:

答案 0 :(得分:4)

“嵌套数据框架”具有特定含义,因为提出了这个问题。 2016年,它可能会被解释如下:

dat1 <- data.frame(labels = rep(1, 3), predictions = rep(43, 3))
dat2 <- data.frame(labels = c(rep(1, 5), 0),
                   predictions = c(43, 21, 43, 43, 24, 24))
dat1
#>   labels predictions
#> 1      1          43
#> 2      1          43
#> 3      1          43
dat2
#>   labels predictions
#> 1      1          43
#> 2      1          21
#> 3      1          43
#> 4      1          43
#> 5      1          24
#> 6      0          24

dat <- list(HIV = 1:2, data = list(dat1, dat2))
attr(dat, "row.names") <- 1:2
class(dat) <- c("tbl_df", "data.frame")

dat # nested data frame, using the "tidyr" package definition of "nest"
#>   HIV                                     data
#> 1   1                      1, 1, 1, 43, 43, 43
#> 2   2 1, 1, 1, 1, 1, 0, 43, 21, 43, 43, 24, 24
str(dat)
#> Classes 'tbl_df' and 'data.frame':   2 obs. of  2 variables:
#>  $ HIV : int  1 2
#>  $ data:List of 2
#>   ..$ :'data.frame': 3 obs. of  2 variables:
#>   .. ..$ labels     : num  1 1 1
#>   .. ..$ predictions: num  43 43 43
#>   ..$ :'data.frame': 6 obs. of  2 variables:
#>   .. ..$ labels     : num  1 1 1 1 1 0
#>   .. ..$ predictions: num  43 21 43 43 24 24

library(tidyr)
dat # nicer printing with the tidyr package
#> Source: local data frame [2 x 2]
#> 
#>     HIV               data
#>   (int)              (chr)
#> 1     1 <data.frame [3,2]>
#> 2     2 <data.frame [6,2]>
unnest(dat) # ordinary data frame representation
#> Source: local data frame [9 x 3]
#> 
#>     HIV labels predictions
#>   (int)  (dbl)       (dbl)
#> 1     1      1          43
#> 2     1      1          43
#> 3     1      1          43
#> 4     2      1          43
#> 5     2      1          21
#> 6     2      1          43
#> 7     2      1          43
#> 8     2      1          24
#> 9     2      0          24

答案 1 :(得分:1)

你可以整理细节,但粗略地说:

dat1 <- data.frame(V1 = rep(1, 5), V2 = sample(c(40:45), 5)
dat2 <- data.frame(V1 = sample(c(0,1), 5, replace = TRUE),
 V2 = sample(c(40:45), 5, replace = TRUE))

> hiv <- list(hiv.dat1 = as.list(dat1), hiv.dat2 = as.list(dat2))
> hiv
$hiv.dat1
$hiv.dat1$V1
[1] 1 1 1 1 1

$hiv.dat1$V2
[1] 41 42 43 40 44


$hiv.dat2
$hiv.dat2$V1
[1] 0 1 1 0 0

$hiv.dat2$V2
[1] 42 43 40 44 43