2014-04-13 2 views
0

데이터 프레임에서 반복되는 샘플을 이름별로 찾아서 평균을 계산하고 싶습니다. 하지만 먼저, 샘플 이름의 평등 테스트가 작동하지 않습니다 (또는 '연결', 확실하지 않습니다. print() 및 write.table을 사용한 디버깅이 도움이되지 않았기 때문입니다). 내가 도대체 ​​뭘 잘못하고있는 겁니까?데이터 프레임의 두 열 헤더의 동등성 테스트 R

내 데이터 테이블에 20531 개의 행과 1155 개의 열이 있으므로 행당 반복되는 열의 평균을 얻고 싶습니다.

동등성 테스트를위한 내 코드 (첫 번째 열 헤더는 '유전자 ID'이므로 dfs [, 1]을 건너 뛰고 동등성 테스트 후 대상 열을 하나의 데이터 프레임에 연결하려고 시도합니다.)

dfs <- as.data.frame(dfs) 
for(i in 2:ncol(dfs)) { 
    oneOftheSamples <- data.frame(dfs[,i]) 
    colnames(oneOftheSamples) <- colnames(dfs)[i] 
    head(oneOftheSamples) 
    wantedcolname <- colnames(oneOftheSamples) 
    n <- i 
    for (j in n:ncol(dfs)){ 
    foundcolname <- colnames(dfs)[j] 
    if((wantedcolname==foundcolname) & (j!=i)){ 
     repOftheSample <- data.frame(dfs[,j]) 
     colnames(repOftheSample) <- colnames(dfs)[j] 
     oneOftheSamples <- data.frame(oneOftheSamples,repOftheSample) 
    } 
    } 
} 

어떤 조언이나 의견이 유용 할 수 있습니다. 미리 감사드립니다.

답변

0

팁은 다음에 데이터를 공유하는 것입니다. 그리고 난 당신의 루프가 일을 할 생각하지만, 귀하의 게시물을 기반으로 무엇을 알아낼 수 없습니다, 이것은 당신이 열 중 일부는 더이보다 중복

set.seed(1618) 
dat <- matrix(rpois(100, 1), ncol = 10) 
colnames(dat) <- sample(LETTERS[1:5], 10, replace = TRUE) 
dat <- as.data.frame(dat, check.names = FALSE) 

# A B D E A B B C E B 
# 1 0 2 0 2 3 1 0 0 3 0 
# 2 1 1 0 1 0 1 0 0 2 1 
# 3 0 0 2 0 0 1 4 1 3 0 
# 4 1 0 0 0 0 2 0 2 0 1 
# 5 0 1 0 1 0 2 0 2 0 1 
# 6 1 0 2 1 1 1 1 0 1 0 
# 7 1 1 1 0 1 1 1 1 0 0 
# 8 0 1 1 1 1 0 1 1 0 0 
# 9 0 1 1 1 1 2 0 1 0 0 
# 10 0 1 0 2 1 0 0 2 0 1 

중복 된 컬럼의 평균을 얻을 수있는 방법이다 시간은, 그래서 오직 유일한 사람이

(dups <- unique(names(dat)[duplicated(names(dat))])) 
# [1] "A" "B" "E" 
dat.list <- lapply(dups, function(x) dat[names(dat) %in% x]) 
# list of three 

난 당신이 행이 바로 내 데이터의 설명과 함께 각

dat1 <- sapply(1:length(dat.list), function(x) 
    apply(dat.list[[x]], 1, mean)) 
colnames(dat1) <- dups 

as.data.frame(dat1) 
#  A B E 
# 1 1.5 0.75 2.5 
# 2 0.5 0.75 1.5 
# 3 0.0 1.25 1.5 
# 4 0.5 0.75 0.0 
# 5 0.0 1.00 0.5 
# 6 1.0 0.50 1.0 
# 7 1.0 0.75 0.0 
# 8 0.5 0.50 0.5 
# 9 0.5 0.75 0.5 
# 10 0.5 0.50 1.0 
+0

미안 해요, 난 편집 할 수 있습니다 내 대답하는 수단을 원하는 같은데요합니다. 저는 R 프로그래밍에 완전히 익숙하지 않지만 C++ 경험이 적으므로 R 데이터 구조에 대해 약간의 모조처럼 보일 수 있습니다. 어쨌든, 나는 (적어도 나는 생각한다) 코드를 이해하지만, 나의 전체 스크립트와 같은 방식으로 실행했다 : "dfs.list [[x]]의 오류 : subscript가 범위를 벗어났다 전화 : sapply -> sapply -> lapply -> 재미 -> 적용 " 나는 그의 경계 밖으로 배열에 액세스하려고 생각하지 않습니다. 나는 내가 망쳐 놓은 것을 알아 내려고 노력한다. 답장을 보내 주셔서 감사합니다. – szusz

+0

정확히 열 이름이 중복 된 것으로 생각하지 않습니다. 위의 FALSE로 replace = TRUE를 변경하면 중복이 없으며 오류를 재현 할 수 있습니다. 'read.table' 또는 이와 유사한 것으로 데이터를 읽을 때, 여러분은 콜론 이름이 중복되면'check.names = FALSE'; 그렇지 않으면, dup cols는'A, A.1, A.2' 등으로 코드화 될 것입니다. 여러분의 데이터를위한'dups' 또는'dat.list'의 길이는 얼마입니까? 그것이 0이면 문제가됩니다. 또한, 위의 데이터 프레임 크기로 실행하고, 내 노트북에 몇 초 안에 완료되므로 문제가 없어야합니다. – rawr

+0

덕분에 많은 도움이되었습니다. read.table 대신에 read.columns를 사용했습니다. 여러 파일에서 지정된 열을 읽어야합니다.이 함수에서는 'check.names'인수를 설정할 수 없지만 이제는 코드를 다시 작성합니다. – szusz

관련 문제