在R中过滤出特定样本对中存在的观测值

3
我有一个与样本关联的观测列表。我想要删除在特定样本对中出现的相同观测。
数据示例:
sample observation
sample1A 5
sample1B 7
sample2A 10
sample2B 10
sample3A 10
sample3B 5

所以,想法是根据字母A和B将样本分组成对,然后对于每个这样的对,删除任何具有匹配观测值的行。
在上面的例子中,只有来自样本2A和样本2B的观测值会被排除,因为它们来自同一个样本,即在两个不同的场合(样本2A和样本2B)采样的样本2。输出应该是这样的:
sample observation
sample1A 5
sample1B 7
sample3A 10
sample3B 5

如果可以使用DPLYR来实现这个目标,那将会非常有用,因为我正在努力提高我的熟练度。
我想象一下,使用group_by()按样本名称对数据进行分组,然后使用filter()可能会起作用,但我不确定如何处理基于正则表达式或字符串的首次配对的嵌套条件,然后通过查找行之间匹配值来进行过滤。
提前感谢您的帮助。

这将非常容易,只需要3个变量:sampleNum,sampleLet和observation。然后执行dat[with(dat, !(duplicated(sampleNum & observation) | duplicated(sampleNum & observation, FromLast=TRUE)),] - lmo
如果我可以像向量或矩阵一样在R中复制数据,那就更好了。 - and-bri
3个回答

5
我们可以通过删除'sample'中的最后一个字符来创建一个分组,然后根据唯一的'observation'数量进行筛选,即如果长度大于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

数据

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
一个基于循环的解决方案。
# 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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接