首页 > 解决方案 > 根据列中元素的位置对 R 中的数据框进行子集化

问题描述

我有一个数据框,它有 5 行和 6 列。列中可能有也可能没有元素

案例1中的元素

df <- data.frame(
  Hits = c("Hit1", "Hit2", "Hit3", "Hit4", "Hit5"),
  category1 = c("a1", "", "b1", "a1", "c1"),
  category2 = c("", "", "", "", "a2"),
  category3 = c("a3", "", "b3", "", "a3"),
  category4 = c("", "", "", "", ""),
  category5 = c("", "", "a5", "b5", ""),
  stringsAsFactors = FALSE)

在此处输入图像描述

案例2

在此处输入图像描述

对于案例 1 ,从的每一列,我只需要保留出现在最高位置的元素,即

在此处输入图像描述

最后,删除这五列中没有元素的行,即

在此处输入图像描述

对于案例 2,我想只保留最上面的一行,即

在此处输入图像描述

如何将这两种情况的解决方案合并在一起?

标签: rdataframesubset

解决方案


您可以使用条件语句来处理这两种情况并将其包含在slice-

library(dplyr)

df %>%
  mutate(across(starts_with('category'), ~replace(., -match(TRUE, . != ''), ''))) %>%
  slice({
    tmp <- if_any(starts_with('category'), ~. != '')
    if(any(tmp)) which(tmp) else 1
  })

对于案例 1,这将返回 -

#  Hits category1 category2 category3 category4 category5
#1 Hit1        a1                  a3                    
#2 Hit3                                                a5
#3 Hit5                  a2                              

对于案例 2 -

#  Hits category1 category2 category3 category4 category5
#1 Hit1                            

推荐阅读