由于您希望将数据按性别和年份“分组”,因此我建议对这些变量进行重新整形,过滤掉您不想要的内容,然后重新整形。
library(dplyr)
library(tidyr) # pivot_*
dat %>%
pivot_longer(-c(Year, Gender), values_to = "value") %>%
filter(value != "0") %>%
pivot_wider(c(Year, Gender), names_from = name, values_from = value)
# # A tibble: 2 x 5
# Year Gender BMW VW Mercedes
# <int> <chr> <chr> <chr> <chr>
# 1 2018 Male Max <NA> <NA>
# 2 2019 Male Peter Peter Peter
如果存在重复的年份/性别/姓名,则会出现问题。例如,
bind_rows(dat, dat[3,])
# Year Gender BMW VW Mercedes
# 1 2018 Male Max 0 0
# 2 2019 Male Peter 0 0
# 3 2019 Male 0 Peter 0
# 4 2019 Male 0 0 Peter
# 5 2019 Male 0 Peter 0
bind_rows(dat, dat[3,]) %>%
pivot_longer(-c(Year, Gender), values_to = "value") %>%
filter(value != "0") %>%
pivot_wider(c(Year, Gender), names_from = name, values_from = value)
# Warning: Values are not uniquely identified; output will contain list-cols.
# * Use `values_fn = list` to suppress this warning.
# * Use `values_fn = length` to identify where the duplicates arise
# * Use `values_fn = {summary_fun}` to summarise duplicates
# # A tibble: 2 x 5
# Year Gender BMW VW Mercedes
# <int> <chr> <list> <list> <list>
# 1 2018 Male <chr [1]> <NULL> <NULL>
# 2 2019 Male <chr [1]> <chr [2]> <chr [1]>
在这种情况下,如果您想删除完美的重复项,那么您可以这样做:
bind_rows(dat, dat[3,]) %>%
pivot_longer(-c(Year, Gender), values_to = "value") %>%
filter(value != "0", !duplicated(.)) %>% # updated
pivot_wider(c(Year, Gender), names_from = name, values_from = value)
# # A tibble: 2 x 5
# Year Gender BMW VW Mercedes
# <int> <chr> <chr> <chr> <chr>
# 1 2018 Male Max <NA> <NA>
# 2 2019 Male Peter Peter Peter
虽然确实“失去”了彼得两次列出大众汽车的事实......这可能是两个不同的大众汽车。如果您想要/需要保留此信息,请使用 hackish 修复
bind_rows(dat, dat[3,]) %>%
pivot_longer(-c(Year, Gender), values_to = "value") %>%
filter(value != "0") %>%
group_by(Year, Gender, name, value) %>%
mutate(name = paste0(name, replace(seq_along(name), 1, ""))) %>%
ungroup() %>%
pivot_wider(c(Year, Gender), names_from = name, values_from = value)
# # A tibble: 2 x 6
# Year Gender BMW VW Mercedes VW2
# <int> <chr> <chr> <chr> <chr> <chr>
# 1 2018 Male Max <NA> <NA> <NA>
# 2 2019 Male Peter Peter Peter Peter
(或在不影响其他汽车的情况下明确传达“第二大众”的类似方式)。
数据
dat <- structure(list(Year = c(2018L, 2019L, 2019L, 2019L), Gender = c("Male", "Male", "Male", "Male"), BMW = c("Max", "Peter", "0", "0"), VW = c("0", "0", "Peter", "0"), Mercedes = c("0", "0", "0", "Peter")), class = "data.frame", row.names = c(NA, -4L))