我有一个与样本相关的观察列表.我想删除特定样本对中出现的相同观察结果.
数据示例:
sample observation
sample1A 5
sample1B 7
sample2A 10
sample2B 10
sample3A 10
sample3B 5
Run Code Online (Sandbox Code Playgroud)
因此,想法是基于字母A和B将样本分组成对,然后对于这些对中的每一对,移除具有匹配观察的任何行.
在上述情况下,仅排除样品2A和样品2B的观察结果,因为它们来自相同的样品,样品2,在两个不同的场合取样(样品2A和样品2B).输出看起来像:
sample observation
sample1A 5
sample1B 7
sample3A 10
sample3B 5
Run Code Online (Sandbox Code Playgroud)
如果可以使用DPLYR这样做是非常有用的,因为我正在努力提高我的熟练程度.
我想使用group_by()根据样本名称将数据分组,然后使用filter()可以工作,但我不知道如何处理基于正则表达式或字符串的第一次配对的嵌套条件,然后过滤通过查找行之间的匹配值.
在此先感谢您的帮助.
我们可以通过删除'sample'中的最后一个字符然后filter根据唯一'观察'的数量创建一个组,即如果length大于1,我们保留它
library(dplyr)
df2 %>%
group_by(grp = sub("[A-Z]$", "", sample)) %>%
filter(n_distinct(observation)>1) %>%
ungroup() %>%
select(-grp)
# A tibble: 4 x 2
# sample observation
# <chr> <int>
#1 sample1A 5
#2 sample1B 7
#3 sample3A 10
#4 sample3B 5
Run Code Online (Sandbox Code Playgroud)
df2 <- structure(list(sample = c("sample1A", "sample1B", "sample2A",
"sample2B", "sample3A", "sample3B"), observation = c(5L, 7L,
10L, 10L, 10L, 5L)), .Names = c("sample", "observation"),
class = "data.frame", row.names = c(NA, -6L))
Run Code Online (Sandbox Code Playgroud)