R의 특정 샘플 쌍에있는 관측치를 필터링합니다.




r plot legend (2)

'샘플'의 마지막 문자를 제거하고 고유 한 '관측'의 수를 기준으로 그룹을 만들면 그룹을 만들 수 있습니다. 즉, 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

데이터

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))

샘플과 관련된 관찰 목록이 있습니다. 특정 샘플 쌍에서 발생하는 동일한 관찰을 제거하고 싶습니다.

데이터의 예 :

sample observation
sample1A 5
sample1B 7
sample2A 10
sample2B 10
sample3A 10
sample3B 5

따라서 A와 B라는 글자를 기준으로 샘플을 쌍으로 그룹화 한 다음 각 쌍에 대해 일치하는 관측치가있는 행을 제거하는 것이 좋습니다.

위의 경우에서 sample2A와 sample 2B의 관측치는 두 개의 개별적인 경우 (표본 2A와 표본 2B)에서 표본 추출 된 동일한 표본 sample2에서 나온 것이므로 제외됩니다. 결과는 다음과 같습니다.

sample observation
sample1A 5
sample1B 7
sample3A 10
sample3B 5

DPLYR을 사용하여이 작업을 수행하는 것이 가능하다면 그 작업을 더욱 능숙하게 수행 할 수 있습니다.

Group_by ()를 사용하여 샘플 이름을 기반으로 그룹으로 데이터를 정렬 한 다음 filter ()를 사용하면 작동 할 수 있다고 상상 합니다만 정규 표현식이나 문자열을 기반으로하는 첫 번째 쌍의 중첩 조건을 처리하는 방법을 잘 모릅니다 행 사이에서 일치하는 값을 찾아서

귀하의 도움에 미리 감사드립니다.


루프가있는 기본 솔루션입니다.

# 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




dplyr