如何在R中使用一个列值在另一个列值的基础上删除行?

How to use one column value to delete rows on the basis of another column value in R?

提问人:user3692552 提问时间:11/17/2023 最后编辑:MrFlickuser3692552 更新时间:11/17/2023 访问量:62

问:

我有一个具有以下结构的数据框:

data <- data.table(
  Name = c("orc1", "orc1", "orc1", "orc2", "orc2", "orc4", "orc4", "orc4"),
  Subject = c("apple1", "apple2", "pear", "apple1", "apple2", "ban1", "ban2", "ban3"),
 Cross = c("apple1, apple2", "apple1, apple2", "", "", "", "ban1, ban2, ban3", "ban1, ban2, ban3", "ban1, ban2, ban3"),
 Count = c(3, 3, 3, 3, 3, 3, 3, 3)
)

最终,我想按 Name 分组,并通过对“Count”变量求和进行汇总,以便最终每个 Name 值都有一行。

例:

Name Count
Orc1   9
Orc2  6
Orc4  12

但是,“Cross”变量告诉我,某些值不应被视为唯一值,因此在汇总时不应计算两次。例如,对于上面的内容,应该只占总数一次,而不是两次。因此,的总和应该是 6 而不是 9。总和应为 3。Subjectorc1apple1apple2orc1orc4

就我而言,我至少可以想到两种可行的解决方案:

  1. 删除行。示例:使用 中的信息删除显示为 .orc1sourceorc1apple2subject

  2. 设置为 0。示例:对于 ,请使用 中的信息将显示为 的行的值设置为 0。Countorc1sourceCountorc 1apple2subject

所以最终,我应该得到这个:

Name Count
Orc1.  6
Orc2   6
Orc4  3 

我尝试了各种方法,但总是被困在如何以一种可用于限制输出的方式解析信息上。

r dplyr

评论

0赞 scott.pilgrim.vs.r 11/17/2023
你只想对每个求和吗?如果是这样,那很容易。还是你还需要考虑?countNamesubject
0赞 user3692552 11/17/2023
@scott.pilgrim.vs.r 最后,每个 . 仅与限制求和的内容一起使用。countnamesubjectCross

答:

2赞 jkatam 11/17/2023 #1

请尝试以下代码

data %>%  
  mutate(new=ifelse(Cross!='',duplicated(Cross), NA)) %>% filter(new %in% c(FALSE, NA)) %>% 
  group_by(Name) %>%
  summarise(Count= sum(Count))

创建于 2023-11-16 with reprex v2.0.2

# A tibble: 3 × 2
  Name  Count
  <chr> <dbl>
1 orc1      6
2 orc2      6
3 orc4      3
1赞 MrFlick 11/17/2023 #2

我们可以过滤数据中具有空交叉值或与交叉描述中列出的第一个值匹配的交叉值的行。使用,我们可以做到dplyrstringr

library(dplyr)
data %>% 
  filter(Cross=="" | stringr::str_split_i(Cross, ", ", 1) == Subject) %>% 
  summarize(Count=sum(Count), .by=Name)
#   Name Count
# 1 orc1     6
# 2 orc2     6
# 3 orc4     3

这确实假定始终存在 Name 与 Cross 列中列出的第一个值匹配的记录