使用列表作为元素从数据框中提取数据?

时间:2017-03-16 11:24:04

标签: r list dataframe

我有以下数据框:

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

这里保持简单,但这将是数据帧的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),然后我也能够在Test $ X1 [[i]]上循环,但测试给出了

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

这不是我想要的。有谁知道怎么做?

1 个答案:

答案 0 :(得分: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

但是,使用unnest

中的tidyr会变得非常简单
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