提问人:user3692552 提问时间:11/17/2023 最后编辑:MrFlickuser3692552 更新时间:11/17/2023 访问量:62
如何在R中使用一个列值在另一个列值的基础上删除行?
How to use one column value to delete rows on the basis of another column value in R?
问:
我有一个具有以下结构的数据框:
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。Subject
orc1
apple1
apple2
orc1
orc4
就我而言,我至少可以想到两种可行的解决方案:
删除行。示例:使用 中的信息删除显示为 .
orc1
source
orc1
apple2
subject
设置为 0。示例:对于 ,请使用 中的信息将显示为 的行的值设置为 0。
Count
orc1
source
Count
orc 1
apple2
subject
所以最终,我应该得到这个:
Name Count
Orc1. 6
Orc2 6
Orc4 3
我尝试了各种方法,但总是被困在如何以一种可用于限制输出的方式解析信息上。
答:
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
我们可以过滤数据中具有空交叉值或与交叉描述中列出的第一个值匹配的交叉值的行。使用,我们可以做到dplyr
stringr
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 列中列出的第一个值匹配的记录
评论
count
Name
subject
count
name
subject
Cross