填写信息后删除特定行 [英] Delete specific rows after filling information

查看:9
本文介绍了填写信息后删除特定行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要填写有关客户的信息,为了避免重复信息,我需要删除信息的来源。我的数据集如下所示:

dat <- data.frame(datea = c(NA,"202105",NA,NA,"202106",NA,NA,"202110",NA),
                  client_id = c("aaa","aaa","bbb","ccc","ccc","ddd","eee","eee","eee"),
                  dateb = c("202105",NA,"202107","202106",NA,"202110","202107",NA,"202107"),
                  qt_prod1 = c(10,NA,30,2,NA,11,14,NA,145),
                  qt_prod2 = c(12,NA,433,221,NA,312,312,NA,121))

> dat
   datea client_id  dateb qt_prod1 qt_prod2
1   <NA>       aaa 202105       10       12
2 202105       aaa   <NA>       NA       NA
3   <NA>       bbb 202107       30      433
4   <NA>       ccc 202106        2      221
5 202106       ccc   <NA>       NA       NA
6   <NA>       ddd 202110       11      312
7   <NA>       eee 202107       14      312
8 202110       eee   <NA>       NA       NA
9   <NA>       eee 202107      145      121

我想要的是某种程度上合并数据集,以便将所有信息放在一行中,但不是按客户端。我不希望客户端BBB的信息中填满了客户端AAA数据。我想要的输出是:

dat2 <- data.frame(datea = c("202105",NA,"202106",NA,"202110",NA),
                  client_id = c("aaa","bbb","ccc","ddd","eee","eee"),
                  dateb = c("202105","202107","202106","202110","202107","202107"),
                  qt_prod1 = c(10,30,2,11,14,145),
                  qt_prod2 = c(12,433,221,312,312,121))

> dat2
   datea client_id  dateb qt_prod1 qt_prod2
1 202105       aaa 202105       10       12
2   <NA>       bbb 202107       30      433
3 202106       ccc 202106        2      221
4   <NA>       ddd 202110       11      312
5 202110       eee 202107       14      312
6   <NA>       eee 202107      145      121

谢谢,

推荐答案

library(dplyr)
dat %>%
  group_by(client_id) %>%
  mutate(across(everything(), ~ sort(., na.last = TRUE))) %>%
  filter(rowSums(!is.na(cur_data())) > 0) %>%
  ungroup()
# # A tibble: 6 x 5
#   datea  client_id dateb  qt_prod1 qt_prod2
#   <chr>  <chr>     <chr>     <dbl>    <dbl>
# 1 202105 aaa       202105       10       12
# 2 NA     bbb       202107       30      433
# 3 202106 ccc       202106        2      221
# 4 NA     ddd       202110       11      312
# 5 202110 eee       202107       14      121
# 6 NA     eee       202107      145      312
我要补充的是,这个操作不是干净的:一行中的数据不会一起保留,因此关于行是观测的帧的一个常见假设不会保留(&p>CLEAN&QOOT;):行中的数据不会一起保留,因此关于行是观测的帧的一个常见假设不会保留。这可能是故意的。

这篇关于填写信息后删除特定行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆