簡體   English   中英

如何折疊 R 中分布在不同列中的分組信息

[英]How to collapse grouped information spread across different columns in R

我有一個問題應該有一個非常直接的解決方案,但我似乎找不到它。 基本上我有嵌套在區*縣內的觀察,但他們的候選人價值是錯誤的,並且單個候選人的信息分布在多個列中。 原始數據集有同樣的問題,但不是只有四個非分組變量,而是有 500 多個。

但這是現在的樣子:

current_df
   county district candidate  name votes party
1    E100        1         1  john    NA  <NA>
2    E100        1         2  <NA>   100  <NA>
3    E100        1         3  <NA>    NA     D
4    E101        2         4 maria    NA  <NA>
5    E101        2         5  <NA>   200  <NA>
6    E101        2         6  <NA>    NA     I
7    E202        1         7   tom    NA  <NA>
8    E202        1         8  <NA>    78  <NA>
9    E202        1         9  <NA>    NA     R
10   E204        3        10  jose    NA  <NA>
11   E204        3        11  <NA>   120  <NA>
12   E204        3        12  <NA>    NA  <NA>

這就是我想要的:

target_df <- data.frame(county = c("E100",  "E101","E202", "E204"),
                         district= c(1, 2, 1, 3),
                         candidate = c(1, 1, 2, 1),
                         name = c("john","maria",
                                  "tom", "jose"),
                         votes = c(100,
                                   200,
                                   78,
                                   120),
                         party = c( "D",
                                    "I",
                                    "R",
                                    NA))

同樣,如果有一個解決方案不是建立在除縣和區之外只有 4 個變量的事實的基礎上,那是理想的,因為我有很多 dataframe。作為參考, candidate只是每個候選人的有序指標區。

此外,有些行,例如target_dfcandidate == "jose"的行,其政黨價值為 NA。 這只是數據上下文的 function。

我已經嘗試了很多方法,但仍然找不到做得好的東西。 非常歡迎任何指點,謝謝!

這是另一種選擇(也忽略了candidate的問題。您可以通過采用非 NA 的第一個實例來總結每個組

library(tidyverse)

current_df |>
  group_by(county, district) |>
  summarise(across(everything(), ~first(.[!is.na(.)])))
#> # A tibble: 4 x 6
#> # Groups:   county [4]
#>   county district candidate name  votes party
#>   <chr>     <dbl>     <dbl> <chr> <dbl> <chr>
#> 1 E100          1         1 john    100 D    
#> 2 E101          2         4 maria   200 I    
#> 3 E202          1         7 tom      78 R    
#> 4 E204          3        10 jose    120 R

或其他選擇。 按組填寫NA和select一審:

current_df %>%
  group_by(county, district)|>
  fill(everything(), .direction = "updown") |>
  filter(row_number() == 1)
#> # A tibble: 4 x 6
#> # Groups:   county, district [4]
#>   county district candidate name  votes party
#>   <chr>     <dbl>     <dbl> <chr> <dbl> <chr>
#> 1 E100          1         1 john    100 D    
#> 2 E101          2         4 maria   200 I    
#> 3 E202          1         7 tom      78 R    
#> 4 E204          3        10 jose    120 R

部分解決方案,直到列candidate被完全解釋

library(tidyverse) 

df %>% 
  mutate(across(everything(), as.character)) %>% 
  select(-candidate) %>% 
  pivot_longer(-c(1:2)) %>% 
  drop_na() %>% 
  pivot_wider(names_from = name, 
              values_from = value)

# A tibble: 4 × 5
  county district name  votes party
  <chr>  <chr>    <chr> <chr> <chr>
1 E100   1        john  100   D    
2 E101   2        maria 200   I    
3 E202   1        tom   78    R    
4 E204   3        jose  120   R    

暫無
暫無

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

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