R:如果数据中持续存在良好的输入,则填充缺失值

pxyaymoc  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(136)

想象一个数据集:

df1 <- tibble::tribble(~Client, ~Client_ID, ~Year,  ~NPurchases,    ~Age,   ~Sex,   ~Hobby,
"Alex Smith",   88888,  2022,   NA, 30, "Male", "",
"Alex Smith",   88888,  2022,   45, 30, "Male", "Stamps",
"Alex Smith",   88888,  2021,   32, 29, "Male", "Stamps",
"Eugene Hugs",  788272, 2022,   2,  19, "Male", "Cats")

或者,可视化表示的相同数据集:

核心列是Client_ID和Year。例如,Alex Smith有两个2022的输入。您能否建议一些好方法:
1.删除缺失值较多的行
1.查找具有不同缺失数据的重复行,查看它们(以确定是否存在错误),然后删除数据较少的行。
任何好的建议都将非常感谢:)
例如,我的即时想法是:

unique(rbindlist(list(df1))[!is.na(NPurchases), .(Client, Client_ID, Year, Age, NPurchases, Sex, Hobby)])

输出:

但我确信应该有更通用、更整洁的方法:)
预期输出:
1.对于第一种变体:

1.对于第二种变型:类似的解决方案,将提供它删除的行上的数据。
dplyr有一个很棒的解决方案,你能建议其他好的解决方案吗?

jfewjypa

jfewjypa1#

或者,您可以尝试以下不带filter_at的代码

df2 <- df1 %>% mutate(sum=rowSums(across(everything(), ~(.x %in% c(NA, ' '))))) %>% 
filter(sum==0) %>% select(-sum)

创建于2023年1月21日,使用reprex v2.0.2

# A tibble: 3 × 7
  Client      Client_ID  Year NPurchases   Age Sex   Hobby 
  <chr>           <dbl> <dbl>      <dbl> <dbl> <chr> <chr> 
1 Alex Smith      88888  2022         45    30 Male  Stamps
2 Alex Smith      88888  2021         32    29 Male  Stamps
3 Eugene Hugs    788272  2022          2    19 Male  Cats
11dmarpk

11dmarpk2#

请尝试dplyr中的filter_at函数

library(dplyr)

df2 <- df1 %>% filter_at(vars(everything()), ~!(.x %in% c(NA, ' ')))

创建于2023年1月21日,使用reprex v2.0.2

# A tibble: 3 × 7
  Client      Client_ID  Year NPurchases   Age Sex   Hobby 
  <chr>           <dbl> <dbl>      <dbl> <dbl> <chr> <chr> 
1 Alex Smith      88888  2022         45    30 Male  Stamps
2 Alex Smith      88888  2021         32    29 Male  Stamps
3 Eugene Hugs    788272  2022          2    19 Male  Cats

相关问题