4

特に、列名のベクトルに基づいてデータフレームをサブセット化する関数をRで記述しています。[.data.frame'j'引数が欠落している場合、すべての列を返すデフォルトの動作を利用しようとしています。欠落している引数をラッパー関数に渡す方法はありますか?これが骨の折れる例です:

fixDataFrames <- function(listOfDataFrames, columns){
    lapply(listOfDataFrames, function(x) x[,columns])
}

列の値を指定しないと、関数に渡すときにエラーが発生し[ます。「列の引数がありません。デフォルトはありません」。

4

4 に答える 4

6

何も指定されていない場合にすべての列を取得するように、列のデフォルトを設定できます。TRUEを使用すると機能するはずです

fixDataFrames <- function(listOfDataFrames, columns = TRUE){
    lapply(listOfDataFrames, function(x) x[,columns])
}

# As Chase points out it is probably more prudent to add drop=FALSE as a parameter
fixDataFrames <- function(listOfDataFrames, columns = TRUE, drop = FALSE){
    lapply(listOfDataFrames, function(x) x[, columns, drop = drop])
}
于 2013-03-26T22:00:00.363 に答える
2

少し異なる方法は、匿名関数を持たずに[直接呼び出すことです。

fixDataFrames <- function(listOfDataFrames, columns = TRUE, drop = TRUE){
    lapply(listOfDataFrames, `[`, , j = columns, drop = drop)
}

,2つの間の空白スペースは、行インデックスのスペースを表すため、重要であることに注意してください。iこれを省略したままにすると、と同じ動作になりdf[ , columns]ます。また、これdrop = TRUEをデフォルトとして設定した[ので、楽しみは動作を維持します。

@Chaseの回答からの同じデータで:

## Sample data
df1 <- df2 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
listOfDataFrames <- list(df1, df2)

fixDataFrames(listOfDataFrames)
fixDataFrames(listOfDataFrames, 2)
fixDataFrames(listOfDataFrames, 2, drop = FALSE)

与える

> fixDataFrames(listOfDataFrames)
[[1]]
            x1          x2          x3
1  -1.98347150 -0.50473182  0.56554491
2  -0.19597580  0.41004825 -0.35646296
3   0.81792146 -0.07646175 -2.02534426
4  -0.01903514  0.70687248 -0.25373188
5  -0.49233958  0.42497338 -0.15647100
6   0.62296268  1.88127659  0.41952414
7  -0.27260248 -2.59046602 -1.99294060
8   1.46344557  1.44803287  0.08634971
9   0.62207040  1.78290849 -0.17131320
10 -1.05730518 -0.45478467  1.15346862

[[2]]
            x1          x2          x3
1  -1.98347150 -0.50473182  0.56554491
2  -0.19597580  0.41004825 -0.35646296
3   0.81792146 -0.07646175 -2.02534426
4  -0.01903514  0.70687248 -0.25373188
5  -0.49233958  0.42497338 -0.15647100
6   0.62296268  1.88127659  0.41952414
7  -0.27260248 -2.59046602 -1.99294060
8   1.46344557  1.44803287  0.08634971
9   0.62207040  1.78290849 -0.17131320
10 -1.05730518 -0.45478467  1.15346862

> fixDataFrames(listOfDataFrames, 2)
[[1]]
 [1] -0.50473182  0.41004825 -0.07646175  0.70687248  0.42497338  1.88127659
 [7] -2.59046602  1.44803287  1.78290849 -0.45478467

[[2]]
 [1] -0.50473182  0.41004825 -0.07646175  0.70687248  0.42497338  1.88127659
 [7] -2.59046602  1.44803287  1.78290849 -0.45478467

> fixDataFrames(listOfDataFrames, 2, drop = FALSE)
[[1]]
            x2
1  -0.50473182
2   0.41004825
3  -0.07646175
4   0.70687248
5   0.42497338
6   1.88127659
7  -2.59046602
8   1.44803287
9   1.78290849
10 -0.45478467

[[2]]
            x2
1  -0.50473182
2   0.41004825
3  -0.07646175
4   0.70687248
5   0.42497338
6   1.88127659
7  -2.59046602
8   1.44803287
9   1.78290849
10 -0.45478467
于 2013-03-26T22:17:37.667 に答える
1

これはハックのように見え...ますが、この動作を可能にするように2番目の引数を設定します。

#Sample data
df1 <- df2 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
listOfDataFrames <- list(df1, df2)


fixDataFrames <- function(listOfDataFrames, ...){
  lapply(listOfDataFrames, function(x) x[,...])
}

> fixDataFrames(listOfDataFrames)
[[1]]
           x1         x2         x3
1  -1.7475354 -1.3444461  0.2049100
2   0.1451163  1.4396253  0.5885829
...
[[2]]
           x1         x2         x3
1  -1.7475354 -1.3444461  0.2049100
2   0.1451163  1.4396253  0.5885829

, drop = FALSE単一の列が選択されている場合に、data.frameがベクトルに強制変換されないようにするために追加することもできます。

于 2013-03-26T21:55:27.447 に答える
0

これはテストされていませんが、試してください。

fixDataFrames <- function(listOfDataFrames, columns){
    lapply(listOfDataFrames, function(x) 
        if (missing(columns)) {
            columns <- 1:ncol(x)
        }
        x[,columns]
    )
}
于 2013-03-26T21:51:06.553 に答える