7

先ほどの質問に答えようとしたときに、単純なはずなのにわからない問題に出くわしました。

データフレームのリストがある場合:

df1 <- data.frame(a=1:3, x=rnorm(3))
df2 <- data.frame(a=1:3, x=rnorm(3))
df3 <- data.frame(a=1:3, x=rnorm(3))

df.list <- list(df1, df2, df3)

一緒にやりたいrbindことは、次のことができます。

df.all <- ldply(df.list, rbind)

data.frameただし、各行がどの行から来たかを識別する別の列が必要です。deparse(substitute(x))メソッド (ここと他の場所) を使用して、関連する名前を取得しdata.frame、列を追加できると期待していました。これは私がそれにアプローチした方法です:

fun <- function(x) {
  name <- deparse(substitute(x))
  x$id <- name
  return(x)
}
df.all <- ldply(df.list, fun)

どちらが返されますか

  a          x      id
1 1  1.1138062 X[[1L]]
2 2 -0.5742069 X[[1L]]
3 3  0.7546323 X[[1L]]
4 1  1.8358605 X[[2L]]
5 2  0.9107199 X[[2L]]
6 3  0.8313439 X[[2L]]
7 1  0.5827148 X[[3L]]
8 2 -0.9896495 X[[3L]]
9 3 -0.9451503 X[[3L]]

明らかに、リストの各要素には名前が含まれていないと思います。私が期待したものを取得する方法を誰かが提案できますか (以下を参照)。

  a          x  id
1 1  1.1138062 df1
2 2 -0.5742069 df1
3 3  0.7546323 df1
4 1  1.8358605 df2
5 2  0.9107199 df2
6 3  0.8313439 df2
7 1  0.5827148 df3
8 2 -0.9896495 df3
9 3 -0.9451503 df3
4

4 に答える 4

10

リストを名前で定義すると、名前の.id列が表示されますdata.frame

df.list <- list(df1=df1, df2=df2, df3=df3)
df.all <- ldply(df.list, rbind)

出力:

  .id a           x
1 df1 1  1.84658809
2 df1 2 -0.01177462
3 df1 3  0.58579469
4 df2 1 -0.64748756
5 df2 2  0.24384614
6 df2 3  0.59012676
7 df3 1 -0.63037679
8 df3 2 -1.17416295
9 df3 3  1.09349618

data.frameすると列から名前がわかりますdf.all$.id

編集: @Gary Weissmanのコメントに従って、名前を自動的に生成したい場合は、行うことができます

names(df.list) <- paste0('df',seq_along(df.list)
于 2013-03-05T02:12:13.367 に答える
3

ベースのみを使用して、次のようなことを試すことができます。

dd <- lapply(seq_along(df.list), function(x) cbind(df_name = paste0('df',x),df.list[[x]]))

do.call(rbind,dd)
于 2013-03-05T02:04:25.907 に答える
2

あなたの定義でdf.listは、に名前はありませんが、それでも、ディパース置換イディオムは簡単に機能しないようです(lapply呼び出しとして.Internal(lapply(X, FUN))-オブジェクト名が使用可能かどうかとその取得方法を確認するには、ソースを調べる必要があります)

何かのようなもの

names(df.list) <- paste('df', 1:3, sep = '')

foo <- function(n, .list){
         .list[[n]]$id <- n
         .list[[n]]
       } 

     a          x id
1 1  0.8204213  a
2 2 -0.8881671  a
3 3  1.2880816  a
4 1 -2.2766111  b
5 2  0.3912521  b
6 3 -1.3963381  b
7 1 -1.8057246  c
8 2  0.5862760  c
9 3  0.5605867  c
于 2013-03-05T02:06:13.417 に答える
2

useのfunction代わりにyour を使用し、2 番目の引数が必要な場合は、必ず次のように変換してください。deparse(substitute(x))match.call()character

 name <- as.character(match.call()[[2]])
于 2013-03-05T02:38:34.657 に答える