我有一个与样本相关的观察列表。我想删除在特定样本对中发生的相同观察结果。
数据示例:
sample observation
sample1A 5
sample1B 7
sample2A 10
sample2B 10
sample3A 10
sample3B 5
因此,我们的想法是根据字母A和B将样本分组,然后对每个对删除任何具有匹配观察值的行。
在上述情况下,仅排除样品2A和样品2B的观察结果,因为它们来自相同的样品,样品2,在两个不同的场合取样(样品2A和样品2B)。输出看起来像:
sample observation
sample1A 5
sample1B 7
sample3A 10
sample3B 5
如果可以使用DPLYR这样做是非常有用的,因为我正在努力提高我的熟练程度。
我想使用group_by()根据样本名称将数据分组,然后使用filter()可以工作,但我不知道如何处理基于正则表达式或字符串的第一次配对的嵌套条件,然后通过查找行之间的匹配值进行过滤。
提前感谢您的帮助。
答案 0 :(得分:5)
我们可以通过删除'sample'中的最后一个字符,然后根据唯一'观察'的数量filter
来创建一个组,即如果length
大于1,我们保留< / p>
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
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))
答案 1 :(得分:1)
带有循环的基础解决方案。
# create data
dat <- c(5,7,10,10,10,5)
names(dat) <- c('sample1A', 'sample1B', 'sample2A', 'sample2B', 'sample3A', 'sample3B')
dat
# lets go
pairs <- substr(names(dat), 1, nchar(names(dat))-1)
single <- unique(pairs)
new_dat <- NULL
for(i in 1:length(single)){
pos <- pairs == single[i]
if(!any(duplicated(dat[pos]))){
new_dat <- c(new_dat, dat[pos])
}
}
new_dat
答案 2 :(得分:1)
如果您的格式是常规格式,您也可以这样做:
df %>% filter(matrix(.$observation,2) %>% {.[1,]!=.[2,]} %>% rep(each=2))
只有基数,并尽可能短:
df[rep(!!diff(matrix(df[[2]],2)),each=2),]
# sample observation
# 1 sample1A 5
# 2 sample1B 7
# 5 sample3A 10
# 6 sample3B 5