2016-05-18 15 views
1

これは私のデータフレームの例です。データフレーム内でネストされたリスト変数のサブセット化と置換

 theo size   dta 
1 0.2776062 10 1.631967.... 
2 0.2776062 10 0.737667.... 
3 0.2776062 10 0.131252.... 
4 0.2776062 10 1.937334.... 
5 0.2776062 10 0.739868.... 
6 0.4310112 20 4.631176.... 
7 0.4310112 20 2.610180.... 
8 0.4310112 20 0.175918.... 
9 0.4310112 20 3.501670.... 
10 0.4310112 20 0.588178.... 

か:

set.seed(777) 
df <- data.frame(theo = numeric(), 
       size = numeric(), 
       dta = I(list())) 
df[ 1: 5,"theo"] <- qlnorm(0.1, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE) 
df[ 6:10,"theo"] <- qlnorm(0.2, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE) 
df[ 1: 5,"size"] <- 10 
df[ 6:10,"size"] <- 20 
for(i in 1:10){ 
    df$dta[i] <- list(rlnorm(df$size[i], meanlog = 0, sdlog = 1)) 
    } 
df 
str(df) 

これは、のようなDFを与える必要があります:それは、私は私のシナリオごとに保存しておきたいのn値の単一のリストがある「DTA」という名前の列変数を含み、 :

'data.frame': 10 obs. of 4 variables: 
$ theo: num 0.278 0.278 0.278 0.278 0.278 ... 
$ size: num 10 10 10 10 10 20 20 20 20 20 
$ dta :List of 10 
    ..$ : num 1.632 0.671 1.667 0.671 5.148 ... 
    ..$ : num 0.738 1.056 0.152 0.967 10.089 ... 
    ..$ : num 0.131 1.256 0.457 3.574 4.211 ... 
    ..$ : num 1.937 2.359 3.496 0.297 4.587 ... 
    ..$ : num 0.74 0.66 0.481 0.434 1.874 ... 
    ..$ : num 4.631 0.298 10.28 0.933 1.286 ... 
    ..$ : num 2.61 0.472 0.251 1.61 0.303 ... 
    ..$ : num 0.176 0.566 2.156 0.407 3.52 ... 
    ..$ : num 3.502 1.748 1.283 0.648 1.359 ... 
    ..$ : num 0.588 0.392 2.447 1.926 0.86 ... 
    ..- attr(*, "class")= chr "AsIs" 

さて、私は、このような方法でそのリストをサブセットしたいこと:

    ここで、各リストについて、各値は、その値が「テオ」に等しい未満である場合、またはデータフレーム
  1. に格納されている固定値「テオ」と比較される
  2. 、その値を再コーディングNA

でありますコードを作業し、私が欲しい、まさに私を与える:私は思っていたが

df$dta2 <- df$dta 
for(i in 1:10){ 
    df$dta2[[i]] [ df$dta2[[i]] <= df$theo[i] ] <- NA 
    } 

があることの条件付き交換を進めるための「forループ」がない単一のコード行と同じ結果を得るとする方法ですデータフレームにネストされたリストに含まれる値?

答えて

0

我々はMap

df$dta3 <- Map(function(x,y) replace(x, x<=y, NA), df$dta, df$theo) 
all.equal(df$dta2, df$dta3, check.attributes=FALSE) 
#[1] TRUE 
+0

を使用することができますあなたがそんなにakrunありがとうございます。これを行うにはいい素敵な方法:) – Zef

+0

akrun、私はall.equalテストのための "真"を取得していません。私は次のエラーメッセージを受け取ります:[1] "la cible est NULL、l'actuel est list"または "target is NULL、actual is list"。 all.equalを実行するためのアイデアはありますか? – Zef

+0

@ Zef私のコードはあなたが示した例に基づいています。元のデータにNULL要素があるようです。 – akrun

関連する問題