2016-07-23 48 views
0

假設我有以下數據幀:轉換數據幀至由行與命名載體中的R列出

| a | b | c | 
x | 1 | 2 | 3 | 
y | 4 | 5 | 6 | 
z | 7 | 8 | 9 | 

我想通過行把它轉換成一個列表,其中每個包含名爲向量,這基本上是相當於list(x=c(a=1,b=2,c=3), y=c(a=4,b=5,c=6), x=c(a=7,b=8,c=9))的輸出:

$x 
a b c 
1 2 3 

$y 
a b c 
4 5 6 

$x 
a b c 
7 8 9 

我該如何去做這件事?

回答

2

我們可以使用

res <- lapply(split(df1, row.names(df1)), unlist) 
str(res) 
#List of 3 
#$ x: Named int [1:3] 1 2 3 
# ..- attr(*, "names")= chr [1:3] "a" "b" "c" 
#$ y: Named int [1:3] 4 5 6 
# ..- attr(*, "names")= chr [1:3] "a" "b" "c" 
#$ z: Named int [1:3] 7 8 9 
# ..- attr(*, "names")= chr [1:3] "a" "b" "c" 
+0

謝謝!但結果不是一個有名向量的列表,列表鍵只是數字而不是rownames。 – Cenoc

+0

@Cenoc我改變了一下代碼。你還認爲它不是一個命名向量列表? – akrun

1

我的使用purrr包這些類型任務的大風扇:

df <- read.table(text = " a b c 
        x 1 2 3 
        y 4 5 6 
        z 7 8 9", header = TRUE) 

library(purrr) 

df_as_list <- set_names(by_row(df, ~ unlist(.x), .collate = "list")$.out, rownames(df)) 

df_as_list 

# $x 
# a b c 
# 1 2 3 
# 
# $y 
# a b c 
# 4 5 6 
# 
# $z 
# a b c 
# 7 8 9 

typeof(df_as_list$x) 
# [1] "integer" 

,顧名思義按行通過dfby_row週期,在這種情況下,將unlist(a_row)應用於每行,將其作爲向量返回。正如我們希望輸出作爲列表.collate設置爲"list"。我們返回列表.out,然後根據需要命名(因爲名稱不是自然保留的)。

相關問題