2017-02-23 2 views
0

동일한 열과 행 이름을 가진 R 데이터 프레임의 셀을 대체하는 방법을 찾는 데 관심이 있습니다. 이는 공간 객체 간의 최소 거리를 비교하기 때문에 객체를 자체와 비교하는 것은 유용하지 않습니다. 예를 들어, 열 이름이 모두 "3"이고 행 이름이 "3"인 경우 현재 값을 "NA"로 바꿔야합니다.열과 행 이름이 같은 데이터 프레임 셀 값 바꾸기

나는 if 문을 가지고 놀았지만, 이것을 간과 할 수있는 간단한 방법이 있다고 생각한다. 나는 상대적으로 코딩에 익숙하지 않으므로 샘플 코드와 설명에 감사 할 것입니다.

+0

아마도 거리가 0 인 인스턴스는 행 이름이 열 이름과 동일한 경우 일 수 있습니다. min() 함수에 포함되지 않도록 NA를 0으로 대체 할 수 있습니까? –

+0

그냥 대각선입니까? 'diag (df) <- NA'? – thelatemail

+0

답변

1

사용자 정의 기능은 replace_matching()입니다. ...

d <- data.frame(a = 1:10) 
for (i in 2:10) { 
    d[[letters[i]]] <- 1:10 
} 
rownames(d) <- letters[10:1] 
d 
#> a b c d e f g h i j 
#> j 1 1 1 1 1 1 1 1 1 1 
#> i 2 2 2 2 2 2 2 2 2 2 
#> h 3 3 3 3 3 3 3 3 3 3 
#> g 4 4 4 4 4 4 4 4 4 4 
#> f 5 5 5 5 5 5 5 5 5 5 
#> e 6 6 6 6 6 6 6 6 6 6 
#> d 7 7 7 7 7 7 7 7 7 7 
#> c 8 8 8 8 8 8 8 8 8 8 
#> b 9 9 9 9 9 9 9 9 9 9 
#> a 10 10 10 10 10 10 10 10 10 10 

기능 ...

replace_matching <- function(df, replace_with = NA) { 
    # Find all combinations of row and column names 
    name_grid <- expand.grid(rownames(df), colnames(df), stringsAsFactors = FALSE) 

    # Find any names with matches 
    matched_names <- name_grid$Var1[name_grid$Var1 == name_grid$Var2] 

    # Wherever there are matches, set cell to NA 
    for (mn in matched_names) { 
    df[mn, mn] <- replace_with 
    } 

    return(df) 
} 

기본 유스 케이스 ... 여기

일부 장난감 데이터를 : 그것은 심지어는 세포에 삽입 할 것을 조정하게됩니다 -99 기본적 교체 값을 변경
replace_matching(d) 
#> a b c d e f g h i j 
#> j 1 1 1 1 1 1 1 1 1 NA 
#> i 2 2 2 2 2 2 2 2 NA 2 
#> h 3 3 3 3 3 3 3 NA 3 3 
#> g 4 4 4 4 4 4 NA 4 4 4 
#> f 5 5 5 5 5 NA 5 5 5 5 
#> e 6 6 6 6 NA 6 6 6 6 6 
#> d 7 7 7 NA 7 7 7 7 7 7 
#> c 8 8 NA 8 8 8 8 8 8 8 
#> b 9 NA 9 9 9 9 9 9 9 9 
#> a NA 10 10 10 10 10 10 10 10 10 

...

SimonJackson의 데이터 @ 사용
replace_matching(d, -99) 
#>  a b c d e f g h i j 
#> j 1 1 1 1 1 1 1 1 1 -99 
#> i 2 2 2 2 2 2 2 2 -99 2 
#> h 3 3 3 3 3 3 3 -99 3 3 
#> g 4 4 4 4 4 4 -99 4 4 4 
#> f 5 5 5 5 5 -99 5 5 5 5 
#> e 6 6 6 6 -99 6 6 6 6 6 
#> d 7 7 7 -99 7 7 7 7 7 7 
#> c 8 8 -99 8 8 8 8 8 8 8 
#> b 9 -99 9 9 9 9 9 9 9 9 
#> a -99 10 10 10 10 10 10 10 10 10 
2

:

d[cbind(seq_len(nrow(d)), match(rownames(d),colnames(d)))] <- NA 

단순히 match 다음 colnames과의 rownames는 매트릭스 인덱스를 사용하여 교체하십시오. 그럼 그냥

rownames 및 COLNAMES는 정방 행렬/data.frame에서 동일한 순서에있는 경우

:

diag(d) <- NA 

은 ... 그것을 할 것입니다.

+1

매트릭스 인덱스를 잘 활용하십시오! 하나의 작은 제안은 '1 : nrow (d)'를 'seq_len (nrow (d))'로 변경하십시오. 이것은'd

+0

@SimonJackson - 좋은 지적입니다. 편집 됨. – thelatemail

관련 문제