根据多个条件合并行

Merging rows based on multiple conditions

我正在尝试根据多种条件将 3 行合并为 1 行。数据框创建如下:

region <- c("Europe", "Asia", "Europe", "Africa","Europe")
enterprise <- c(1, 1, 2, 3, 3)
q1 <- c(NA, 0, NA, 1, 0)
q2 <- c(0, 1, 1, NA, NA)
q3 <- c(NA, 1, NA, 0, NA)
q4 <- c(NA, 0, 1, 0, 0)
q5 <- c(0,NA,1,NA,1)

df <- data.frame(region, enterprise, q1, q2, q3, q4,q5)

因此,我正在处理调查数据,并尝试将对应于区域 'Europe' 的行合并为一行。条件如下:

  1. 对于任何给定的问题,都应使用最完整的来源。例如,如果企业 2 和 3(欧洲地区)对 q1 有 NA(未回答问题)但企业 1 有答案(0 或 1),则应考虑企业 1 的答案。
  2. 如果3家企业都没有回答(NA)那么NA。
  3. 如果每个地区超过 1 个企业给出完整答案(0 或 1),则应遵循以下企业层次结构,以便选择企业及其答案以包含在最终合并行中。企业 1 在层次结构中的级别最高,其次是企业 2 和 3。例如,企业 1 没有回答问题 (NA),但 2 和 3 回答了。那么要考虑企业2的答案。
  4. 如果3家企业都回答了,那么再按等级排序。

我试过使用

merged = coalesce(df[1,],df[3,],df[5,]) 

但无法正常工作。我不知道如何通过条件,尤其是具有层次结构的条件。我想要的输出如下:

  region q1 q2 q3 q4 q5
1   Asia  0  1  1  0 NA
2 Africa  1 NA  0  0 NA
3 Europe  0  0 NA  1  0

非常感谢您事先提供的任何帮助。

这个怎么样:

library(tidyr)
library(dplyr)

region <- c("Europe", "Asia", "Europe", "Africa","Europe")
enterprise <- c(1, 1, 2, 3, 3)
q1 <- c(1, 0, NA, 1, NA)
q2 <- c(0, 1, 1, NA, NA)
q3 <- c(NA, 1, NA, 0, NA)
q4 <- c(1, 0, 1, 0, 0)

df <- data.frame(region, enterprise, q1, q2, q3, q4)

df %>% 
  pivot_longer(q1:q4, names_to="q", values_to="vals") %>% 
  group_by(region, q) %>% 
  mutate(ind = min(enterprise[which(!is.na(vals))])) %>% 
  filter(enterprise == ind) %>% 
  pivot_wider(values_from = "vals", names_from = "q") %>% 
  select(region, q1, q2, q3, q4)

#> # A tibble: 3 × 5
#> # Groups:   region [3]
#>   region    q1    q2    q3    q4
#>   <chr>  <dbl> <dbl> <dbl> <dbl>
#> 1 Europe     1     0    NA     1
#> 2 Asia       0     1     1     0
#> 3 Africa     1    NA     0     0

reprex package (v2.0.1)

创建于 2022-02-22

一种使用fill

的方法
library(dplyr)
library(tidyr)

df %>% 
  group_by(region) %>% 
  fill(q1:q5, .direction="updown") %>% 
  arrange(enterprise) %>% 
  summarise(across(q1:q5, ~ .x[1]))
# A tibble: 3 × 6
  region    q1    q2    q3    q4    q5
  <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
1 Africa     1    NA     0     0    NA
2 Asia       0     1     1     0    NA
3 Europe     0     0    NA     1     0