【问题标题】:How to export values from the list of lists into a data frame?如何将列表列表中的值导出到数据框中?
【发布时间】:2020-08-03 15:21:10
【问题描述】:

我有一个非常复杂的结构,见下图。我为这个问题苦苦挣扎了很长时间,我真的需要帮助。

这是使我的问题更可重现的示例代码

t <- list(
list(answers = list(list(values = "male"),
                   list(values = "6"),
                   list(values = "9"),
                   list(values = "9"),
                   list(values = "other"))
 ),
list(answers = list(list(values = "145")
                  )
)

我需要的是 answers 中的值(来自每个列表)。

我需要它看起来像一个数据框——每个列表都是列(变量),answers 中第一个列表的每个值显然都是值。像这样

> d <- data.frame("1" = "male", "2" = 6,
+                 "3" = 9, "4.1" = 9,
+                 "4.2" = 8,
+                 "5" = "other",
+                 "6" = 145)
> d

    X1 X2 X3 X4  X5   X6
1 male 6  9  9  other 145

另一个问题是answers 的第一个列表中的值可以包含多个值。而且我真的不知道如何处理它,因为我需要准确地为变量分配它们的值。

所以,我无法想象如何得到这个。直觉上我觉得lapply()可能对我有帮助,但是我不知道如何正确使用。

【问题讨论】:

  • 请分享一些可重现的数据 - 最好是 dput(test[1:3]) 用于复制/粘贴数据共享中的前 3 个元素。
  • @GregorThomas 抱歉,我该怎么办?我没有得到你的建议。
  • @GregorThomas 如果你想让我在这里分享这些数据,我应该说我做不到。这些列表中包含一些敏感数据。
  • 然后您需要清理一个小子集或生成一组样本数据。嵌套列表的图片不足以提供答案。
  • 我希望您分享一些与您的真实数据具有相同结构的样本数据。如果您无法分享dput(test[1:3]),也许您可​​以生成具有相同结构的假数据,或者编辑示例数据以删除/更改敏感数据点。

标签: r list loops dataframe


【解决方案1】:

使用您的样本数据:

results = unlist(lapply(t, "[[", "answers"))
names(results) = paste0("X", seq_along(results))
results = as.data.frame(t(results))
#     X1 X2 X3 X4    X5  X6
# 1 male  6  9  9 other 145

这里的数字是 character 类,您可能希望使用 type.convert(results) 将它们转换为数字(尽管它也会将剩余的字符串转换为 factors)。

【讨论】:

    【解决方案2】:

    棘手的一个。这是我的想法。此外,不提供您的数据的dput 也不是很有帮助。

    首先我必须重新创建一个类似于你的数据集(对我来说是额外的工作):

    test <- list(
      list(
        answers = list(
          values = list("6", "8", "4", "11", "18"),
          question = list("some_text_1", "some_text_2", "some_text_3"))
        ),
      list(
        answers = list(
          values = list("male"),
          question = list("some_text_4", "some_text_5", "some_text_6"))
      )
      )
    )
    

    通过一些努力,我可以做到这一点:

    l1 <- lapply(test, function(x) lapply(x,`[[`, 1))
    l2 <- unlist(l1, recursive = FALSE)
    l3 <- unlist(l2, recursive = FALSE)
    

    有了这个结果:

    > l3
    $answers1
    [1] "6"
    
    $answers2
    [1] "8"
    
    $answers3
    [1] "4"
    
    $answers4
    [1] "11"
    
    $answers5
    [1] "18"
    
    $answers
    [1] "male"
    

    或者更简单:

    unlist(l1)
    

    但后者失去了结构,所有values 向量最终都成为单个字符向量。 在您的列表中,我认为这将为您提供第 3 个嵌套级别的所有 values 向量作为具有不等长度元素的列表。因为您的 values 向量的长度不相等,所以我可能不会尝试将其强制为数据框。这够近了吗?

    更新

    随着数据集中的更新,我们现在可以做:

    l1 <- lapply(t, `[[`, 1)
    l2 <- unlist(l1, recursive = FALSE)
    df <- as.data.frame(l2)
    

    这个输出:

    > df
      values values.1 values.2 values.3 values.4 values.5
    1   male        6        9        9    other      145
    

    【讨论】:

    • 非常感谢!但是您的代码无法正常工作。我知道,这是我的错,没有提供示例数据。不过,您的额外工作并不能重现准确的数据结构。
    • 顺便说一句,我刚刚用一些示例代码编辑了我的问题。它向您展示了适当的结构。
    • 我更新了我的回复,因为您的数据集与我最初的假设不同。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多