2013-04-04 121 views
2

我有一個data.frame我想分成一個列表。通過神經網絡傳播價值

我:

data.frame(value=c(1:4,NA,11:12,NA,21:23,NA), 
      key=as.factor(c(NA,NA,NA,NA,"a",NA,NA,"b",NA,NA,NA,"c"))) 
    value key 
1  1 <NA> 
2  2 <NA> 
3  3 <NA> 
4  4 <NA> 
5  NA a 
6  11 <NA> 
7  12 <NA> 
8  NA b 
9  21 <NA> 
10 22 <NA> 
11 23 <NA> 
12 NA c 

我想:

list(a=data.frame(value=1:4), 
    b=data.frame(value=11:12), 
    c=data.frame(value=21:23)) 
$a 
    value 
1  1 
2  2 
3  3 
4  4 

$b 
    value 
1 11 
2 12 

$c 
    value 
1 21 
2 22 
3 23 

我應該能夠使用split得到我想要的東西,如果我可以在key列轉換爲

[1] a a a a a b b b c c c c 
Levels: a b c 

但是,唉,我不知道該怎麼做。

回答

3

這將會給你平矢量你可以split如果你喜歡:

library(zoo) 
na.locf(f$key, fromLast = TRUE) 

[1] a a a a a b b b c c c c 
Levels: a b c 
2

這裏是我的解決方案:

> f <- data.frame(value=c(1:4,NA,11:12,NA,21:23,NA), 
        key=as.factor(c(NA,NA,NA,NA,"a",NA,NA,"b",NA,NA,NA,"c"))) 
> keys <- f$key 
> good <- !is.na(keys) 
> f$key <- NULL 
> l <- split(f,head(cumsum(c(0,good)),-1)) 
> names(l) <- keys[good] 
> lapply(l, function(df) head(df,-1)) 
$a 
    value 
1  1 
2  2 
3  3 
4  4 

$b 
    value 
6 11 
7 12 

$c 
    value 
9  21 
10 22 
11 23 

有沒有更好的辦法?

具體而言,我不喜歡的是

  1. head + cumsum + c組合是醜陋
  2. lapply + head組合是醜陋
1

這也挺髒的,但如果你不介意醜循環它的工作原理

> dat <- data.frame(value=c(1:4,NA,11:12,NA,21:23,NA),key=as.factor(c(NA,NA,NA,NA,"a",NA,NA,"b",NA,NA,NA,"c"))) 
> 
> labels <- which(!is.na(dat$key)) 
> j <- 1 
> for(i in labels){ 
+ dat$key[j:i] <- dat$key[i] 
+ j = i + 1 
+ } 
> 
> split(dat$value[!is.na(dat$value)],as.factor(dat$key[-labels])) 
$a 
[1] 1 2 3 4 

$b 
[1] 11 12 

$c 
[1] 21 22 23