2011-01-31 102 views
1

我有一個看起來像這樣的數據。如何創建嵌套數據幀

> 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 
+0

爲什麼你想這樣做?看起來不太可能產生更容易處理的數據結構。 – hadley 2011-01-31 18:10:53

回答

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 
+0

@RL:謝謝。但它給出「$ hiv.dat1 $ V1」而不是「$ hiv.dat1 $ V1 [[1]]」。有沒有辦法實現這一點?其次,如何將V1命名爲「標籤」? – neversaint 2011-01-31 14:33:50

3

「嵌套數據幀」已在提出這個問題之後的具體含義。在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