45

次の形式のリスト間を行き来する簡単な方法を探しています。

$`a`
  [1] 1 2 3
$`b`
  [1] 4 5 6

次の形式のdata.frameとの間で:

   name x
 1    a 1
 2    a 2
 3    a 3
 4    b 4
 5    b 5
 6    b 6

(この場合、列の名前は気にしないでください。)

上記で使用したR形式のデータフレームは次のとおりです。

df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))

繰り返しになりますが、2つの別々の操作を探しています。1つは上記のdata.frameをリストに変換する操作で、もう1つはそれをdata.frameに戻す操作です。

4

4 に答える 4

60

ベースRでのstack使用:unstack

x <- data.frame(a=1:3, b=4:6)

x
  a b
1 1 4
2 2 5
3 3 6

幅の広いものから高いものまでを使用stackします。つまり、ベクトルを互いに積み重ねます。

y <- stack(x)
y
  values ind
1      1   a
2      2   a
3      3   a
4      4   b
5      5   b
6      6   b

unstack逆を行うために使用します。

unstack(y)
  a b
1 1 4
2 2 5
3 3 6

stackデータ構造が説明したよりも複雑で、unstackもはや適切でない可能性がある場合。その場合reshape、ベースR、またはパッケージで使用する必要がmeltあります。dcastreshape2

于 2012-05-03T15:11:51.847 に答える
11

別のオプションはenframeからですtibble

library(tidyverse)
enframe(lst1) %>%
   unnest

データ

lst1 <- list(a=1:3, b=4:6)
于 2019-08-15T06:17:25.617 に答える
9

多分次のようなものです:

X <- split(df$x, df$name)
data.frame(name = rep(names(X), sapply(X, length)), 
    x=do.call('c', X))

編集: 私はアンドリーと私のソリューションを組み合わせて、OPがかなり単純に求めていたものとまったく同じように見えるものにすることにしました。とはいえ、データフレームはとにかく等しい長さのベクトルのリストであるため、Andrieが行った方法ではなく、この方法でデータを処理する状況を完全には理解していません。

# Your data set
df <- data.frame(name=c(rep("a",3),rep("b",3)), x=c(1:3,4:6))

# converting it to list of vectors
X <- split(df[, 2], df[, 1])
# converting it to a dataframe
Y <- stack(X)[, 2:1]; names(Y) <- names(df)

# Take Y and feed it back to these lines to show it 
# switches back and forth
(X <- split(Y[, 2], Y[, 1]))
Y <- stack(X)[, 2:1]; names(Y) <- names(df);Y
于 2012-05-03T14:14:06.300 に答える
4

@Tyler Rinkerの提案について、自明ではない発言をしたいと思います。

X <- split(df$x, df$name)

より一般的に行うことができます

X <- split(df, df$name)

@Tyler Rinkerのsplit()の説明はRクックブックと一致します

http://my.safaribooksonline.com/book/programming/r/9780596809287/6dot1dot-splitting-a-vector-into-groups/id3392005

ベクトルをグループ化できることを指定しますが、実際にはデータフレーム全体をグループ化できます。ベクトルではなくデータフレームをグループ化する方が、より価値のあるツールになると思います(実際、この投稿にたどり着いたのはそのためです)。

(df <- data.frame(name=c(rep("a",3),rep("b",3), rep("c",3)), x=c(1:3,4:6, 7:9)))
(X <- split(df, df$name))

HTH。

于 2013-02-10T02:00:13.747 に答える