我有一个数据框看起来像是

country sector data1 data2
France 1 7 .
France 2 10 .
belgium 1 12 7
belgium 2 14 8

我想要对一个国家在所有部门中缺失的列进行子集.在本例中,我想删除/排除第二列,因为法国的扇区1和扇区2缺少它.需要说明的是,在本例中,我还将go 掉比利时的data2的值.

我的预期输出将如下所示

country sector data1
France 1 7
France 2 10
belgium 1 12
belgium 2 14

数据2现在被排除在外,因为它有一组完整的法国所有扇区的缺失值

推荐答案

我们可以按国家分组,创建NA个元素的计数等于组大小的逻辑列,取消分组,基于逻辑列将相应的列替换为NA,并移除select中的那些列

library(dplyr)
library(stringr)
df1 %>% 
  group_by(country) %>% 
  mutate(across(everything(), ~ sum(is.na(.x)) == n(),
       .names = "{.col}_lgl")) %>% 
  ungroup %>% 
  mutate(across(names(df1)[-1], ~ if(any(get(str_c(cur_column(), 
     "_lgl")) )) NA else .x)) %>% 
   select(c(where(~ !is.logical(.x) && any(complete.cases(.x)))))

-输出

# A tibble: 4 × 3
  country sector 数据1
  <chr>    <int> <int>
1 France       1     7
2 France       2    10
3 belgium      1    12
4 belgium      2    14

如果我们不使用GROUP_BY,步骤可以简化,如Maël's帖子中所示,即使用select内的基R函数进行分组,即tapplyave都可以工作

df1 %>%
   select(where(~ !any(tapply(is.na(.x), df1[["country"]], 
     FUN = all))))

数据

df1 <- structure(list(country = c("France", "France", "belgium", "belgium"
), sector = c(1L, 2L, 1L, 2L), 数据1 = c(7L, 10L, NA, 14L), 数据2 = c(NA, 
NA, 7L, 8L)), row.names = c(NA, -4L), class = "数据.frame")

R相关问答推荐

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

通过在colname中查找其相应值来创建列

plotly hover文本/工具提示在shiny 中不起作用

根据现有列的名称和字符串的存在进行变异以创建多个新列

您是否可以将组添加到堆叠的柱状图

将选定的索引范围与阈值进行比较

将向量元素重新排序为R中的第二个

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

减少雨云面之间的间距并绘制所有统计数据点

如何根据未知数的多列排除重复行

R-使用stri_trans_General()将其音译为德语字母

有没有办法将勾选/审查标记添加到R中的累积关联图中?

将仪表板中的值框大小更改为Quarto

如何将字符类对象中的数据转换为R中的字符串

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?

我怎么才能把一盘棋变成一盘棋呢?

根据向量对列表元素进行排序

删除r中每个因素级别的最后2行

Data.table条件合并