2017-03-16 61 views
0

我有以下的數據幀:使用列表作爲元素從數據框中提取數據?

Test <- data.frame(matrix(NA, nrow = 1, ncol = 3)) 
Test$X1 <- list(c(0,1)) 
Test$X2 <- list(c(2,3)) 
Test$X3 <- list(c(4,5)) 

這使我可以放置元素的內部列表:

Test 
    X1 X2 X3 
1 0, 1 2, 3 4, 5 

它一直保持在這裏簡單的,但是這將是m個數據幀n。這被傳遞給幾個子程序。現在我需要提取該元素信息。爲此,我循環遍歷列/行。我發現有一次在子程序中我需要做

Test <- as.list(Test) 

Test 
$X1 
$X1[[1]] 
[1] 0 1 


$X2 
$X2[[1]] 
[1] 2 3 


$X3 
$X3[[1]] 
[1] 4 5 

讓子程序理解這個對象。我現在需要提取數據。要做到這一點,我可以使用

dummy_list <- Test$X2[[1]] 
print(dummy_list[1]) 
print(dummy_list[2]) 

它給出值2和3的預期。我需要自動執行此操作,以便我可以遍歷每一對值,即數據框中的每個元素。在這個例子中,我需要:測試$ X1 [[1]],測試$ X2 [[1]]和測試$ X3 [[1]]。我如何遍歷列名Xi?迄今爲止所有的嘗試都失敗了。我又看了看調換數據和固定列名(X1),那麼我會能夠太遍歷測試$ X1 [我],但這個測試給

 X1  X2  X3  
[1,] List,1 List,1 List,1 

這不是我想要的東西。有人知道怎麼做嗎?

+0

您可能想要查看'tidyr'包,它引入了tibbles,它是一種管理數據幀內層次結構的方法 – smci

回答

1

假設,

Test1 <- rbind(Test, Test) 

然後讓你的企圖,

sapply(Test1, function(i) sapply(seq(nrow(Test1)), function(j) i[[j]])) 

#  X1 X2 X3 
#[1,] 0 2 4 
#[2,] 1 3 5 
#[3,] 0 2 4 
#[4,] 1 3 5 

然而,這成爲與unnesttidyr可笑的簡單,

tidyr::unnest(Test1) 

#which outputs a tibble 
# A tibble: 4 × 3 
#  X1 X2 X3 
# <dbl> <dbl> <dbl> 
#1  0  2  4 
#2  1  3  5 
#3  0  2  4 
#4  1  3  5 

它也可以實現使用matrix

matrix(unlist(Test1), ncol = ncol(Test1)) 

#which outputs a matrix 
#  [,1] [,2] [,3] 
#[1,] 0 2 4 
#[2,] 1 3 5 
#[3,] 0 2 4 
#[4,] 1 3 5