2

私は「簡単すぎる質問はない」という精神で書いていると思います。私は、初めて R に近づき、終わりのない夜を R に直面させている平均的な Stata ユーザーの社会科学者にすぎません。ご容赦ください。

私は 20 か国からの比較データセット (約 20,000 の観察、国間で非常にバランスが取れている) を使用しています。非常に計算量の多い MCMC シミュレーションのセットを実行する必要があるため、df を 20 個の (国固有の) df を含むリストに分割し、 に進むことにしましlapply()た。for( R でループを回避する方が効率的であると読みましたよね?)

私の最も差し迫った問題は、リストに含まれるさまざまな df 内の要素を前処理できないことです。特に、15 個の変数のセットを再コーディングする必要があります。これらは 0 から 10 の範囲の整数で、欠落しているケースの SPSS の典型的な値を含みます: 77 88, 89, 99, 999. これらの値を に再コード化してからNA、少し追加の変換を行いたいと思います。0 を中心にして、2 つの df オブジェクトTを定義TTし、後でシミュレーションで使用する 2 つの異なる変数セットを使用します。このタスクは、「マスター」リスト「ees2009split」を構成する 20 の異なる国固有のリスト要素にわたって繰り返す必要があります。

ees2009split <- vector("list", 20)
ees2009split <- split(ees2009, ees2009$t102) # t102 is the country identifier
names(ees2009split) <- country.names[1:2]    # rename list objects with country names

これが私のリストです(再現可能な例を提供できず申し訳ありません):

    > str(ees2009split)
List of 20
 $         Austria :'data.frame':   1000 obs. of  17 variables:
  ..$ t102   : int [1:1000] 1040 1040 1040 1040 1040 1040 1040 1040 1040 1040 ...
  ..$ q46    : int [1:1000] 77 2 5 5 5 77 5 5 5 77 ...
  ..$ q47_p1 : int [1:1000] 77 3 5 4 77 77 5 1 89 77 ...
  ..$ q47_p2 : int [1:1000] 77 8 7 6 77 77 5 6 5 77 ...
  ..$ q47_p3 : int [1:1000] 77 10 10 9 77 77 5 7 7 77 ...
  ..$ q47_p4 : int [1:1000] 77 10 9 8 77 77 5 7 4 77 ...
  ..$ q47_p5 : int [1:1000] 77 2 5 3 77 77 5 1 3 77 ...
  ..$ q47_p6 : int [1:1000] 77 4 89 5 77 77 89 2 89 77 ...
  ..$ q47_p7 : int [1:1000] 77 3 89 6 77 77 89 3 5 77 ...
  ..$ q47_p8 : int [1:1000] 77 1 0 0 77 77 5 0 89 77 ...
  ..$ q47_p9 : int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p10: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p11: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p12: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p13: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p14: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p15: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
 $         Belgium :'data.frame':   1002 obs. of  17 variables:
  ..$ t102   : int [1:1002] 1056 1056 1056 1056 1056 1056 1056 1056 1056 1056 ...
  ..$ q46    : int [1:1002] 5 0 77 88 77 88 5 2 77 5 ...
  ..$ q47_p1 : int [1:1002] 88 5 77 77 6 77 5 77 5 77 ...
  ..$ q47_p2 : int [1:1002] 88 10 77 77 8 77 89 77 10 77 ...
  ..$ q47_p3 : int [1:1002] 88 7 77 77 5 77 3 77 0 77 ...
  ..$ q47_p4 : int [1:1002] 88 10 77 77 10 77 10 77 10 77 ...
  ..$ q47_p5 : int [1:1002] 88 0 77 77 4 77 4 77 5 77 ...
  ..$ q47_p6 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p7 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p8 : int [1:1002] 99 99 88 99 99 77 99 77 99 99 ...
  ..$ q47_p9 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p10: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p11: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p12: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p13: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p14: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p15: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...

など... 国 20 まで。

lapply()関数rename()とで呼び出される 2 つの関数を定義しましたrecode()

rename <- function(x) {
    # renaming
    names(x) <- gsub("q46", "lr.self", names(x))
    names(x) <- gsub("q47_p", "lr.p", names(x))
    return(x)
}       

ここまでは順調ですね:

> processed.dat <- lapply(ees2009split, renaming)
> str(processed.dat)
List of 20
 $         Austria :'data.frame':   1000 obs. of  17 variables:
  ..$ t102   : int [1:1000] 1040 1040 1040 1040 1040 1040 1040 1040 1040 1040 ...
  ..$ lr.self: int [1:1000] 77 2 5 5 5 77 5 5 5 77 ...
  ..$ lr.p1  : int [1:1000] 77 3 5 4 77 77 5 1 89 77 ...
# I omit the rest...

再コーディング機能を使用すると、代わりに苦労しています:

recoding <- function(x){
        # recode missing values
        x$lr.self[lr.self %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p1[lr.p1 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p2[lr.p2 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p3[lr.p3 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p4[lr.p4 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p5[lr.p5 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p6[lr.p6 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p7[lr.p7 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p8[lr.p8 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p9[lr.p9 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p10[lr.p10 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p11[lr.p11 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p12[lr.p12 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p13[lr.p13 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p14[lr.p14 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p15[lr.p15 %in% c(77, 88, 89, 98, 99, 999)] <- NA

        x$T <- cbind(lr.self, lr.p1, lr.p2, lr.p3, lr.p4, lr.p5, lr.p6, lr.p7, lr.p8, lr.p9, lr.p10, lr.p11, lr.p12, lr.p13, lr.p14, lr.p15) 
        T <- T - 5      # centering on 0

        lrself.resc <- T[,1]    # rescaled lr.self
        TT <- T[,-1]            # whole matrix rescaled

        N <- nrow(TT)
        q <- ncol(TT)
        z <- TT
        x$dat.list <- list(lr.self=lr.self, lr.p1=lr.p1, lr.p2=lr.p2, lr.p3=lr.p3, lr.p4=lr.p4, lr.p5=lr.p5, lr.p6=lr.p6, lr.p7=lr.p7, lr.p8=lr.p8, lr.p9=lr.p9, lr.p10=lr.p10, lr.p11=lr.p11, lr.p12=lr.p12, lr.p13=lr.p13, lr.p14=lr.p14, lr.p15=lr.p15, T=T, TT=TT, lrself.resc, N=N, q=q, z=z)
        return(x$dat.list)
}

これは出力です:

> processed.dat <- lapply(ees2009split, recoding)
Error in match(x, table, nomatch = 0L) : object 'lr.self' not found
Called from: FUN(X[[1L]], ...)
Browse[1]> 

1) のリストに含まれるデータ フレーム内の変数をどのように再コーディングすればよいlapply()ですか? より広くは、関数内で国 df 内にオブジェクトを挿入するにはどうすればよいですか? 2) より一般的な立場では、この進め方は正しいですか? 分割し、タスク固有の関数を定義し、それらを で呼び出しlapply()、最後に再結合しますか?

提案やコメントをありがとう。アンドレア

4

1 に答える 1