2014-04-06 3 views
0

데이터 프레임이 있습니다. 각 행이 주어진 행에서 얼마나 멀리 떨어져 있는지 계산하고 싶습니다. 첫 번째 행에 대해 살펴 보겠습니다. 내가 무엇을하고자하면 다음과 같다데이터 프레임의 행 사이의 계산 차이

> sampleDF 

    X1 X2 X3 
    1 5 5 
    4 2 2 
    2 9 1 
    7 7 3 

: 다음과 같이 데이터 프레임하자

  1. 을 계산 1 행의 차이 & 다른 사람 : sampleDF[1,]-sampleDF[2,]
  2. 는 절대 값을 고려 : abs(sampleDF[1,]-sampleDF[2,])
  3. 차이가 새로 형성된 데이터 프레임의 합계를 계산합니다. rowSums(newDF)

전체 데이터 프레임에 대해 이렇게하십시오.

newDF <- sapply(2:4,function(x) { return (abs(sampleDF[1,]-sampleDF[x,]));})

이 그 결과에 문제를 야기는 전치 목록입니다. 나는이 오류가 이유는 무엇입니까 :

> class(newDF) 
[1] "data.frame" 
> rowSums(newDF) 
Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 
    'x' must be numeric 
> newDF 
    X1 X2 X3 
1 3 3 3 
2 1 4 4 
3 6 2 2 
> 

퍼즐 1 : rowSums을 계산하는 동안 따라서,

newDF <- as.data.frame(t(sapply(2:4,function(x) { return (abs(sampleDF[1,]-sampleDF[x,]));})))

는 그러나 또 다른 문제가 발생? 나는 newDF [1,1]가 숫자가 아닌 &리스트라는 것을 알았다. 그것 때문에입니까? 어떻게 sapply &의 결과가 숫자의 단순한 데이터 프레임이라는 것을 보장 할 수 있습니까?

은 그래서 함수 내에서 수정 글로벌 데이터 프레임 &을 만들 진행 :

sapply(2:4,function(x) { newDF <<- as.data.frame(rbind(newDF,abs(sampleDF[1,]-sampleDF[x,])));})

> newDF 
    X1 X2 X3 
2 3 3 3 
3 1 4 4 
4 6 2 2 
> rowSums(outDF) 
2 3 4 
9 9 10 
> 

이 예상되고있다.

퍼즐 2 : 더 깨끗한 방법이 있나요? 데이터 프레임의 모든 행에 대해이 작업을 수행하려면 어떻게해야합니까? (위의 그림은 행 1과의 "거리"에 대한 것입니다.) 다른 행에도이 작업을 수행해야합니까? 루프를 실행하는 것이 유일한 옵션입니까?

답변

1

단어에 넣어하려면 맨해튼 거리를 계산하기 위해 노력하고있다 :

dist(sampleDF, method = "Manhattan") 
# 1 2 3 
# 2 9  
# 3 9 10 
# 4 10 9 9 

구현에 대해서는를, 내가 생각하는 문제는 숫자 벡터를 반환해야 할 때 내부 함수는 data.frame를 반환하는 것입니다 . return(unlist(abs(sampleDF[1,]-sampleDF[x,])))으로 수정해야합니다.

+0

설명해 주셔서 감사합니다. 나는 거리를 계산해야한다는 것을 알았지 만 R이 거리를 계산할 무언가를 가지고 있는지 체크하지 않았다. 함수 내에서 unlist도 내 문제를 해결하는 데 도움이됩니다. 이제 거리를 계산하기 위해 사용자 지정 방법을 사용할 수 있는지 확인합니다. –

관련 문제