根据多个条件合并行
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' 的行合并为一行。条件如下:
- 对于任何给定的问题,都应使用最完整的来源。例如,如果企业 2 和 3(欧洲地区)对 q1 有 NA(未回答问题)但企业 1 有答案(0 或 1),则应考虑企业 1 的答案。
- 如果3家企业都没有回答(NA)那么NA。
- 如果每个地区超过 1 个企业给出完整答案(0 或 1),则应遵循以下企业层次结构,以便选择企业及其答案以包含在最终合并行中。企业 1 在层次结构中的级别最高,其次是企业 2 和 3。例如,企业 1 没有回答问题 (NA),但 2 和 3 回答了。那么要考虑企业2的答案。
- 如果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
我正在尝试根据多种条件将 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' 的行合并为一行。条件如下:
- 对于任何给定的问题,都应使用最完整的来源。例如,如果企业 2 和 3(欧洲地区)对 q1 有 NA(未回答问题)但企业 1 有答案(0 或 1),则应考虑企业 1 的答案。
- 如果3家企业都没有回答(NA)那么NA。
- 如果每个地区超过 1 个企业给出完整答案(0 或 1),则应遵循以下企业层次结构,以便选择企业及其答案以包含在最终合并行中。企业 1 在层次结构中的级别最高,其次是企业 2 和 3。例如,企业 1 没有回答问题 (NA),但 2 和 3 回答了。那么要考虑企业2的答案。
- 如果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