【问题标题】:How to add rows to a nested data frame?如何将行添加到嵌套数据框中?
【发布时间】:2021-12-30 17:50:48
【问题描述】:

我有一个具有以下结构的对象,这对我来说并不常见(数据框中有一个数据框,其中有一个列表)。我想添加新的观察结果,所有变量的值都相同(1 除外);这里的值来自通过索引的额外列表)。对象的嵌套结构使得使用循环很难做到这一点。 因此,我复制了 dput 的输出并将值输入其中。我主要使用函数rep() 和unlist()。执行它并打印对象,我收到一条关于数据帧损坏且对象未更改的警告消息。

向给定结构添加行的常用方法是什么? 我尝试循环遍历它,但还没有成功。

deput(x)

structure(list(collapsed = c(FALSE, FALSE, FALSE), enabled = c(TRUE, 
TRUE, TRUE), id = c("Bilateral", "AlphaTree", "Merge"), parameters = structure(list(
    bands = list(c(1L, 2L, 3L, 5L), c(1L, 2L, 3L, 5L), NULL), 
    intensity = c(3L, NA, NA), saveToDisk = c(FALSE, NA, NA), 
    Strategy = c(NA, "maxDiff", NA), Attribute = c(NA, 
    "", NA), om = c(NA, 27L, NA), Condition = c(NA, NA, 
    "num < 10"), check = c(NA, NA, FALSE), ite = c(NA, 
    NA, 10L), Algo = c(NA, NA, "closest mean")), class = "data.frame", row.names = c(NA, 
3L)), type = c("PreProc", "Seg", "Op")), class = "data.frame", row.names = c(NA, 
3L))

【问题讨论】:

  • @akrun dput 已经很有帮助了!谢谢
  • 不清楚您的预期输出。如果你想添加一行只有一些列值,library(tibble);library(dplyr); x %&gt;% add_row(collapsed = FALSE, enabled = TRUE)
  • 另外,由于有一个data.frame 列,它可以是unpacked 即library(tidyr);x %&gt;% unpack(parameters) 在添加行之前
  • 你能在这里展示如何使用解包功能吗?如何结合 unpack 和 add_row。当我对参数使用 unpack 时,我收到此错误:错误:必须使用有效的下标向量对列进行子集。 x 下标的类型错误list
  • 该错误可能是由于某些软件包版本问题,因为我没有收到 `packageVersion('tidyr') [1] '1.1.3'` 的错误

标签: r dataframe nested base dput


【解决方案1】:

我们可以使用tibble 中的add_row - 未在add_row 中传递的列值将为该行的NA,或者如果它是list,则将转向NULL

library(dplyr)
library(tibble)
x1 <- x %>%
    add_row(collapsed = FALSE)

-输出

x1
  collapsed enabled        id parameters.bands parameters.intensity parameters.saveToDisk parameters.Strategy parameters.Attribute parameters.om
1     FALSE    TRUE Bilateral       1, 2, 3, 5                    3                 FALSE                <NA>                 <NA>            NA
2     FALSE    TRUE AlphaTree       1, 2, 3, 5                   NA                    NA             maxDiff                                 27
3     FALSE    TRUE     Merge             NULL                   NA                    NA                <NA>                 <NA>            NA
4     FALSE      NA      <NA>             NULL                   NA                    NA                <NA>                 <NA>            NA
  parameters.Condition parameters.check parameters.ite parameters.Algo    type
1                 <NA>               NA             NA            <NA> PreProc
2                 <NA>               NA             NA            <NA>     Seg
3             num < 10            FALSE             10    closest mean      Op
4                 <NA>               NA             NA            <NA>    <NA>
> str(x1)
'data.frame':   4 obs. of  5 variables:
 $ collapsed : logi  FALSE FALSE FALSE FALSE
 $ enabled   : logi  TRUE TRUE TRUE NA
 $ id        : chr  "Bilateral" "AlphaTree" "Merge" NA
 $ parameters:'data.frame': 4 obs. of  10 variables:
  ..$ bands     :List of 4
  .. ..$ : int  1 2 3 5
  .. ..$ : int  1 2 3 5
  .. ..$ : NULL
  .. ..$ : NULL
  ..$ intensity : int  3 NA NA NA
  ..$ saveToDisk: logi  FALSE NA NA NA
  ..$ Strategy  : chr  NA "maxDiff" NA NA
  ..$ Attribute : chr  NA "" NA NA
  ..$ om        : int  NA 27 NA NA
  ..$ Condition : chr  NA NA "num < 10" NA
  ..$ check     : logi  NA NA FALSE NA
  ..$ ite       : int  NA NA 10 NA
  ..$ Algo      : chr  NA NA "closest mean" NA
 $ type      : chr  "PreProc" "Seg" "Op" NA

如果我们想给data.frame列中的某些元素加值,那么unpack加值,然后pack再一次

library(tidyr)
x1 <- x%>%
     unpack(parameters)%>%
     add_row(collapsed = FALSE, Condition = "num > 5" ) %>%
     pack(parameters = names(x$parameters))

-输出

> x1
# A tibble: 4 × 5
  collapsed enabled id        type    parameters$bands $intensity $saveToDisk $Strategy $Attribute   $om $Condition $check  $ite $Algo       
  <lgl>     <lgl>   <chr>     <chr>   <list>                <int> <lgl>       <chr>     <chr>      <int> <chr>      <lgl>  <int> <chr>       
1 FALSE     TRUE    Bilateral PreProc <int [4]>                 3 FALSE       <NA>       <NA>         NA <NA>       NA        NA <NA>        
2 FALSE     TRUE    AlphaTree Seg     <int [4]>                NA NA          maxDiff   ""            27 <NA>       NA        NA <NA>        
3 FALSE     TRUE    Merge     Op      <NULL>                   NA NA          <NA>       <NA>         NA num < 10   FALSE     10 closest mean
4 FALSE     NA      <NA>      <NA>    <NULL>                   NA NA          <NA>       <NA>         NA num > 5    NA        NA <NA>        
> str(x1)
tibble [4 × 5] (S3: tbl_df/tbl/data.frame)
 $ collapsed : logi [1:4] FALSE FALSE FALSE FALSE
 $ enabled   : logi [1:4] TRUE TRUE TRUE NA
 $ id        : chr [1:4] "Bilateral" "AlphaTree" "Merge" NA
 $ type      : chr [1:4] "PreProc" "Seg" "Op" NA
 $ parameters: tibble [4 × 10] (S3: tbl_df/tbl/data.frame)
  ..$ bands     :List of 4
  .. ..$ : int [1:4] 1 2 3 5
  .. ..$ : int [1:4] 1 2 3 5
  .. ..$ : NULL
  .. ..$ : NULL
  ..$ intensity : int [1:4] 3 NA NA NA
  ..$ saveToDisk: logi [1:4] FALSE NA NA NA
  ..$ Strategy  : chr [1:4] NA "maxDiff" NA NA
  ..$ Attribute : chr [1:4] NA "" NA NA
  ..$ om        : int [1:4] NA 27 NA NA
  ..$ Condition : chr [1:4] NA NA "num < 10" "num > 5"
  ..$ check     : logi [1:4] NA NA FALSE NA
  ..$ ite       : int [1:4] NA NA 10 NA
  ..$ Algo      : chr [1:4] NA NA "closest mean" NA

【讨论】:

  • 非常感谢!我需要更深入地了解这些包 ;)
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多