3

複数の data.frames のリストを取得しました。各 data.frames から最初の 2 列を削除したいと考えています。私は次のようにしましたが、これはもっとRっぽいと思います。

data(mtcars)
data(iris)
myList <- list(A = mtcars, B = iris)
# helper function
removeCols <- function(df,vec) {
res <- df[,-vec]
}
lapply(myList,removeCols,1:2)

明らかにこれでうまくいきますが、ここで何かを見逃しているように思えます (lapply 内で演算子を使用するなど、技術的には関数でもあるため)。ただし、このアプローチの主な欠点は、そのリストのすべての要素に対して行う小さなタスクごとに、小さなヘルパー関数が必要になることです。

4

2 に答える 2

6

あなたのコードは完全に優れた R です。ただし、2 つの代替オプションがあります。

  1. 無名関数を使用する - これは一般的な解決策です
  2. 演算子を使用する[- このケースに固有

あなたのオリジナル:

xx <- lapply(myList,removeCols,1:2)

無名関数:

yy <- lapply(myList, function(df, vec){df[,-vec]}, 1:2)

[次の演算子を使用します。

zz <- lapply(myList, "[", -(1:2))

これらは同じ結果をもたらします

identical(xx, yy)
[1] TRUE

identical(xx, zz)
[1] TRUE
于 2012-08-09T09:03:50.397 に答える
4

現時点でより R っぽいと想像できる唯一のことは、それを短くしてヘルパー関数を取り除くことです。

data(mtcars)
data(iris)
myList <- list(A = mtcars, B = iris)
lapply(myList,function(x) x[,-(1:2)])

何かを変更する直接的な方法を求める場合:

myList[[1]][,-(1:2)]

しかし、リストはその内容に対する要件のない非常にオープンな構造であるため、実際に異なる可能性があるため、その内容に索引を付けることはできません。ただし、2 つのデータ セットが同じ次元 (nxm) の場合は、それらを 3D 配列に結合して、既知のすべてのインデックス作成トリックが機能するようにすることができます。

于 2012-08-09T09:03:42.490 に答える