簡體   English   中英

按列表元素迭代數據框

[英]Iterate over data frame by elements of a list

我正在嘗試根據通用 ID 的子集合並兩個數據框。 讓我演示一下:

library(tidyverse)
set.seed(42)

df = list(id = c(1,2,3,4,1,2,2,2,1,1),
       group = c("A","A","A","A","B","B","B","B","C","C"),
       val = c(round(rnorm(10,6,6),0))
       ) %>% 
        tbl_df()

df_na = list(id = c(1,1,1,2,3,3,4,5,5,5),
       group = c(rep(NA,10)),
       val = c(rep(NA,10))
       ) %>% 
        tbl_df()

df包含數據和id ,而df_na只包含idNA 我想創建一個包含df的所有信息的組合數據框,並按groupid添加NA ,即對於df中的每個group ,查找dfdf_na中都存在哪些id並合並。

如果我手動執行此操作,即組對組,我會使用如下內容:

A_dist = df %>% filter(group=="A") %>%
  distinct(id) %>%
  pull() 

df_A_comb = df_na %>% 
  filter(id %in% A_dist) %>%
  bind_rows(filter(df, group=="A"))

# A tibble: 11 x 3
      id group   val
   <dbl> <chr> <dbl>
 1     1 NA       NA
 2     1 NA       NA
 3     1 NA       NA
 4     2 NA       NA
 5     3 NA       NA
 6     3 NA       NA
 7     4 NA       NA
 8     1 A        14
 9     2 A         3
10     3 A         8
11     4 A        10

但是很明顯,我寧願自動化這個。 作為tidyverse的新興粉絲,我正在努力了解purrr::map 我可以為每個group創建一個id向量。

df_dist = df %>% 
        split(.$group) %>% 
        map(distinct, id) %>% 
        map("id")

> df_dist
$A
[1] 1 2 3 4

$B
[1] 1 2

$C
[1] 1

但是翻譯我的dplyr方法更復雜,並且會更早地產生錯誤消息。

###this approach doesn't work...
df_comb = df_na %>% 
        map(filter, id %in% df_dist)# %>% 
        ...

Error in UseMethod("filter_"): no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"

任何幫助將不勝感激!

tidyverse 很棒,但有時您可能會忽略簡單索引的強大功能以及apply系列中真正有用的基礎 R 工具。 這個單一lapply函數將為您提供一個列表,其中包含您想要的指定格式的所有數據框:

lapply(unique(df$group), function(x){
  rbind(df_na[df_na$id %in% df$id[df$group == x],], df[df$group == x,])})

結果:

#> [[1]]
#> # A tibble: 11 x 3
#>       id group   val
#>    <dbl> <chr> <dbl>
#>  1     1 <NA>     NA
#>  2     1 <NA>     NA
#>  3     1 <NA>     NA
#>  4     2 <NA>     NA
#>  5     3 <NA>     NA
#>  6     3 <NA>     NA
#>  7     4 <NA>     NA
#>  8     1 A        14
#>  9     2 A         3
#> 10     3 A         8
#> 11     4 A        10
#> 
#> [[2]]
#> # A tibble: 8 x 3
#>      id group   val
#>   <dbl> <chr> <dbl>
#> 1     1 <NA>     NA
#> 2     1 <NA>     NA
#> 3     1 <NA>     NA
#> 4     2 <NA>     NA
#> 5     1 B         8
#> 6     2 B         5
#> 7     2 B        15
#> 8     2 B         5
#> 
#> [[3]]
#> # A tibble: 5 x 3
#>      id group   val
#>   <dbl> <chr> <dbl>
#> 1     1 <NA>     NA
#> 2     1 <NA>     NA
#> 3     1 <NA>     NA
#> 4     1 C        18
#> 5     1 C         6

如果您想將它們連接到一個數據框中,請存儲結果(比如x )並執行以下操作:

do.call(rbind, x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM