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

しかし、残念ながら、私はそれを行う方法がわかりません。

4

3 に答える 3

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
于 2013-04-04T22:05:16.277 に答える
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
于 2013-04-04T23:05:56.580 に答える