2017-11-09 11 views
0

96 셀 (8x12 격자)이 들어있는 플레이트에있는 세포에 미세 입자를 떨어 뜨리는 기계를 사용하고 있습니다. 때때로 한 세포를위한 입자가 인접한 세포로 떨어지면서 세포간에 교차 오염이 일어납니다. 기계가 끝나면 각 셀의 무게를 측정합니다. 이 체중 정보를 세포 그리드의 공간 정보와 결합하여 교차 오염의 잠재적 인 사례를 확인하는 스크립트를 만들고 싶습니다. 나는 이것을하기위한 가장 논리적 인 방법을 생각하려고 노력하고 있으며, 어떤 피드백이라도 대단히 감사 할 것입니다.격자 안의 세포들 사이의 오염을 테스트하기위한 스크립트 작성 조언

이상하게도이 스크립트는 R (dplyr) (가능하면이 종류의 작업과 관련이 있을지 모르지만)로 구현됩니다.

Cell Weight 
A1 2 
B1 2 
C1 2 
D1 2 
E1 2 
F1 2 
G1 2 
H1 2 
A2 2 
B2 0.1 
C2 2 
D2 4 
E2 2 
F2 0.1 
G2 2 
H2 2 
A3 2 
B3 2 
C3 2 
D3 2 
E3 2 
F3 4 
G3 2 
H3 2 
A4 2 
B4 2 
C4 6 
D4 2 
E4 2 
F4 2 
G4 2 
H4 2 

A1-H1은 A12- 때까지, 셀의 그리드, A2-H2 제 등의 첫 행이다

입력 데이터 (격자의 제 4 행에 대해) 다음과 같다 H12.

는 그래서 세포의 그리드에서 실제로 어떻게 보이는지 각 셀에 대해 표시 측정 된 무게, 다음과 같다 : 나는 오염을 포함 할 수 F3 셀을 강조하고 싶습니다 위

2 2 2 2 2 2 2 2 
2 0.1 2 4 2 0.1 2 2 
2 2 2 2 2 4 2 2 
2 2 6 2 2 2 2 2 

경우를 F3 셀은 다른 셀의 무게의 2 배의 무게를 가지며 F2 셀 바로 아래에 있기 때문에 F2 셀을위한 입자는 주변 셀 F3에 떨어질 수 있습니다.

셀 C4 또는 D2는 예상보다 무거울지라도 입자가 의도 한 셀에서 멀리 떨어지지 않을 수 있으므로 셀에 직접 인접한 셀 관심의 대상이 체중이 비정상적으로 고갈되지 않는다면 의심의 여지가 없습니다.

무게 측정에서 노이즈로 인해 셀 사이의 무게에 상당한 차이가 있기 때문에 까다로운 부분은 셀의 예상 무게가 더 적거나 많을 지 여부를 정의하는 것이 까다로운 부분이라고 생각합니다. 이러한 목적으로 비어있는 무게가 < 인 셀을 고려하는 것과 같은 무딘 솔루션을 수행 할 수 있습니다. 그러나 나는 더 나은 해결책은 모든 세포의 평균 무게를 계산하고 비어있는 중간 무게의 10 % 이하의 무게를 가진 세포를 고려하는 것이라고 생각합니다. 오염 검사는 중앙값보다 1.5 배 큰 세포에서만 수행하면됩니다. 나는 이것에 대처하는 방법에 대한 제안에 대해 매우 열려있다.

출력은 테이블에 추가 된 추가 행이 이상적입니다. 오염 의심이없는 셀에는이 행이 비어있게됩니다. 오염이 의심되는 세포는이 줄에서 오염이 발생한 세포의 이름을 포함합니다. 그래서 예를 들어

은 :

Cell Weight Contamination 
A1 2 
B1 2 
C1 2 
D1 2 
E1 2 
F1 2 
G1 2 
H1 2 
A2 2 
B2 0.1 
C2 2 
D2 4 
E2 2 
F2 0.1 
G2 2 
H2 2 
A3 2 
B3 2 
C3 2 
D3 2 
E3 2 
F3 4 F2 
G3 2 
H3 2 
A4 2 
B4 2 
C4 6 
D4 2 
E4 2 
F4 2 
G4 2 
H4 2 

이 오염 검사 문제를 해결하는 가장 좋은 방법에 대해 생각에 어떤 도움을 크게 감상 할 수있다. 또한 R의 유용한 행렬로 데이터의 열을 변환하는 효율적인 방법이 확실하지 않으므로 각 셀에 대해 직접 위와 아래 및 왼쪽과 오른쪽 셀을 검사해야합니다 (셀에 대해 누락 된 셀을 무시 함) 그것들은 가장자리에있다). 현재 데이터는 선형 형식이지만이 테스트가 의도 한대로 작동하려면 매트릭스로 변환되어야한다고 가정합니다.

이 질문의 구조가 잘못되어 있으면 가능한 한 명확히하려고 노력합니다. 더 명확하게하기 위해 어떤 제안이라도 기쁘게 생각합니다.

미리 감사드립니다.

답변

1

데이터를 다시 만들지 않고도이 작업을 수행 할 수 있습니다. 해당 행의 Weight 1.5 * 중간이고 이웃 세포의이 shift 기능을 사용 1. 아래에 무게가있는 경우이 TRUE가되도록 Contamination 열을 설정

library(data.table) 
DT <- as.data.table(my.data) 
median.weight <- DT[, median(Weight)] 
DT[, 
    Contamination := ifelse(
     Weight >= median.weight * 1.5 & 
     ((.I %% 8 != 0 & shift(Weight, n=1, type="lead") < 1) | #not in last column, check next value 
     (.I %% 8 != 1 & shift(Weight, n=1, type="lag") < 1) | #not in first column, check previous value 
     (.I<88 & shift(Weight, n=8, type="lead") < 1) | 
     (.I>8 & shift(Weight, n=8, type="lag") < 1)), 
     TRUE, 
     FALSE 
    ) 
    ] 

: 데이터를 가정 my.data라고 * 8 그리드를 활용하기 위해 1 행 또는 8 행만큼 데이터를 리드/래그 (lag)합니다. .I은 현재 행 번호를 data.table에 저장합니다.

EDIT : 그리드의 첫 번째 열 또는 마지막 열에 있는지 확인하려면 모듈러 연산자 %%을 사용하십시오.

+0

오, 나는 이것이 매우 흥미 롭다. 나는 교대 기능을 발견하지 못했다. 나는 내일 시험해보고 당신에게 돌아갈 것이다. 고맙습니다. – user964689

1

명시 적으로 중첩 된 루프에 의존하면서 3 ~ 8 인접 셀 (3 개가 모서리에 있으면 3 개, 중간에 8 개)이 오염 될 수 있습니다. 또한 하나 이상의 이웃 셀에서 발생할 수있는 오염을 허용합니다. 즉, 나는 이것이 R보다 훨씬 더 나은 R 형 접근 방식이 있다는 긍정적 인 견해를 가지고 있습니다.

weight <- c(2, 2, 2, 2, 2, 2, 2, 2, 2, 0.1, 2, 4, 2, 0.1, 2, 2, 
      2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2) 

# for now hardcode number of rows, but if you wanted, you could take 
# the maximum numeric portion of the Cell vector 
m <- matrix(weight, nrow = 4, byrow = T) 

b <- quantile(as.vector(t(m)), c(0.05, 0.95)) 

# flag cells below/above the 5th/95th percentile, respectively 
m1 <- ifelse(m <= b[1], -1, ifelse(m >= b[2], 1, 0)) 

m2 <- matrix(NA_character_, nrow = nrow(m1), ncol = ncol(m1)) 

for (i in 1:nrow(m1)) { 
    for (j in 1:ncol(m1)) { 
    if (m1[i, j] == 1) { 
     # don't attempt to go out of matrix bounds 
     rows <- max(c(i - 1, 1)):min(c(i + 1, nrow(m1))) 
     cols <- max(c(j - 1, 1)):min(c(j + 1, ncol(m1))) 

     # allow for multiple possible contamination cells 
     o <- c() 
     for (r in rows) { 
     for (c in cols) { 
      if (m1[r, c] == -1) { 
      o <- c(o, paste0(LETTERS[c], r)) 
      } 
     } 
     } 

     if (length(o) > 0) { 
     m2[i, j] <- paste0(o, collapse = ";") 
     } 
    } 
    } 
} 

colnames(m2) <- LETTERS[1:ncol(m2)] 
rownames(m2) <- 1:nrow(m2) 

data.frame(weight, Contaminates = as.vector(t(m2))) 

별도로 5/95 백분위 수 아래/위의 경우 셀에 플래그를 지정합니다. 이것은 귀하의 필요에 맞게 변경할 수 있습니다.

+0

고마워. – user964689