【问题标题】:How to extract or unnest an unnamed value from a nested or list column?如何从嵌套或列表列中提取或取消嵌套未命名的值?
【发布时间】:2021-09-17 05:57:23
【问题描述】:

以下 df 有一个列表列 (CVcCVq),它有一个数值。我想将此单个值提取到另一列或将此列表列转换为数字列。

我过去曾使用以下代码提取列表的元素(例如,通过使用.x$value),但我无法弄清楚如何引用(CVcCVq)中的未命名(?)值:

df <-
   df %>% 
   mutate(CVcCVq = map_dbl(CVcCVq, ~ .x$value))

这是我正在使用的数据框的示例:

df <- 
   structure(list(site = c("Hungerford", "Hungerford", "Hungerford", 
"Hungerford", "Hungerford", "Hungerford"), date = structure(c(16244, 
16244, 16244, 16244, 16245, 16245), class = "Date"), q = c(0.13302763934, 
0.13302763934, 0.13302763934, 0.13302763934, 0.118154355, 0.118154355
), year = c(2014, 2014, 2014, 2014, 2014, 2014), var = c("DOC", 
"NO3", "SRP", "turb", "DOC", "NO3"), value = c(8.41162692329658, 
2.68458225207895, 0.0100915159605364, 8.0213, 8.23726061695833, 
2.49696316297646), CVcCVq = list(0.129399469450364, 0.504972938773432, 
    1.13463616961327, 0.602451097752468, 0.129399469450364, 0.504972938773432)), row.names = c(NA, 
-6L), groups = structure(list(site = c("Hungerford", "Hungerford", 
"Hungerford", "Hungerford"), year = c(2014, 2014, 2014, 2014), 
    var = c("DOC", "NO3", "SRP", "turb"), .rows = structure(list(
        c(1L, 5L), c(2L, 6L), 3L, 4L), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r list tidyverse tidyr purrr


    【解决方案1】:

    您可以在此处使用unlist()unnest(),或使用子集[[ 提取。 我建议你在这里坚持使用unnest()。如果您有多个嵌套列表列,它会更加一致和清晰,并且更易于使用。

    library(dplyr)
    
    df%>%mutate(CVcCVq=unlist(CVcCVq))
    
    #OR
    
    library(dplyr)
    library(tidyr)
    
    df%>%unnest(cols=CVcCVq)
    
    #OR
    
    df%>%mutate(CVcCVq=`[[`(CVcCVq, 1))
    
    #OR
    
    df%>%mutate(CVcCVq=CVcCVq[[1]])
    
    
    # A tibble: 6 x 7
    # Groups:   site, year, var [4]
      site       date           q  year var    value CVcCVq
      <chr>      <date>     <dbl> <dbl> <chr>  <dbl>  <dbl>
    1 Hungerford 2014-06-23 0.133  2014 DOC   8.41    0.129
    2 Hungerford 2014-06-23 0.133  2014 NO3   2.68    0.505
    3 Hungerford 2014-06-23 0.133  2014 SRP   0.0101  1.13 
    4 Hungerford 2014-06-23 0.133  2014 turb  8.02    0.602
    5 Hungerford 2014-06-24 0.118  2014 DOC   8.24    0.129
    6 Hungerford 2014-06-24 0.118  2014 NO3   2.50    0.505
    

    您也可以使用自己的代码的变体:

    df%>%mutate(CVcCVq=map_dbl(CVcCVq, ~.x))
    

    【讨论】:

    • df%&gt;%mutate(CVcCVq=unlist(CVcCVq)) 适用于我共享的 df 子集,但不适用于完整的 df。尝试使用完整的 df 时出现以下错误:Error: Problem with mutate()` 列 CVcCVq。 ℹCVcCVq = unlist(CVcCVq)。 ℹ CVcCVq 的大小必须是 146 或 1,而不是 117。ℹ 错误发生在第 1 组:site = "Hungerford", year = 2014, var = "DOC"。`
    • df%&gt;%unnest(cols=CVcCVq)df%&gt;%mutate(CVcCVq=[[(CVcCVq, 1)) 都在子集和完整数据帧上工作!谢谢!
    • df%&gt;%mutate(CVcCVq=CVcCVq[[]]) 不适用于子集或完整 df。它完全删除了CVcCVq
    • df%&gt;%mutate(CVcCVq=map_dbl(CVcCVq, ~.x)) 使用我共享的子集,但不是完整的 df。我收到以下错误:错误:mutate()CVcCVq 出现问题。 ℹCVcCVq = map_dbl(CVcCVq, ~.x)。 x 结果 118 必须是单双精度,而不是长度为 0 的 NULL ℹ 第 1 组发生错误:site = "Hungerford", year = 2014, var = "DOC"。
    • 我建议你在这里坚持使用 unnest。如果您有多个嵌套列表列,它会更加一致和清晰,并且更易于使用。如图所示,如果您有 NULL 列表元素,其他人可能会失败,因为我怀疑您可能有
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多