[英]Named List To/From Data.Frame
我正在尋找一種在以下格式列表之間來回切換的快速方法:
$`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))
同樣,我正在尋找兩個單獨的操作:一個將上述 data.frame 轉換為列表,另一個將其轉換回 data.frame。
在基礎 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
和dcast
封裝reshape2
。
也許是這樣的:
X <- split(df$x, df$name)
data.frame(name = rep(names(X), sapply(X, length)),
x=do.call('c', X))
編輯:我決定將 Andrie 和我的解決方案組合成一個似乎正是 OP 要求的相當簡單的解決方案。 話雖如此,我不太明白我會以這種方式處理數據而不是安德里如何處理數據的情況,因為數據幀無論如何都是等長向量的列表。
# 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
另一種選擇是enframe
從tibble
library(tidyverse)
enframe(lst1) %>%
unnest
lst1 <- list(a=1:3, b=4:6)
我希望對@Tyler Rinker 的建議發表評論
X <- split(df$x, df$name)
可以更普遍地完成
X <- split(df, df$name)
@Tyler Rinker 的 split() 解釋與 R 食譜相符
指定可以對向量進行分組,而實際上可以對整個數據幀進行分組。 我認為對數據框而不是向量進行分組將是更有價值的工具(實際上是什么讓我看到了這篇文章)。
(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))
哈。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.