2017-10-22 1 views
1

저는 R에서 초보자이고 코드에서 특별한 경우를 디버깅하려고합니다. 다음 행에서 벡터가 확실히 존재하는 열을 기반으로 정렬 된 벡터 x을 얻는 중입니다. 당연히, 나는 sorted.data이 동일하고 대부분의 경우에 그럴 것이라고 기대합니다.return type of() in R

대부분의 경우
print (paste("x=",typeof(x))) 
print (x) 
sorted.data <- x[order(x[[max.column]]), ] 
print (paste("type of sorted=", typeof(sorted.data))) 
print (sorted.data) 

위의 코드의 출력은 다음과 같습니다

[1] "x= list" 
    V1 V5 
8 10 0 
16 7 0 
18 7 0 
20 1 96 
24 9 0 

[1] "type of sorted= list" 
    V1 V5 
8 10 0 
16 7 0 
18 7 0 
24 9 0 
31 5 0 

그러나 어떤 시점에서

, 출력은 : 무엇이 잘못 갈 수

[1] "x= list" # Expected. a vector with 1 column 
    V1 
8 10 
16 7 
18 7 
24 9 
26 10 

[1] "type of sorted= integer" # This shouldn't happen 
[1] 0 0 0 1 1 1 1 2 2 3 3 4 4 4 

? 반환 값이 변경되는 이유는 무엇입니까?

+2

'의 X [순서 (X [[max.column]])]' 실제로'list' 일 경우에는 작동하지 않아야합니다. 이것이'data.frame'이 아닌 것이 확실합니까? (이것이 어쨌든 여기에 표시되는 방법입니다.)'data.frame'이라고 가정하고, 행을 색인 할 때 기본 모드, "결과는 가능한 가장 작은 차원으로 강제 변환됩니다"*, 하나의 열이 의미 할 때 그것은 벡터에 강제된다. 'x [order (x [[max.column]]) ,, drop = TRUE]'를 사용해보십시오. (['help ("[["''] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html)을 참조하십시오.) – r2evans

+1

@ r2evans 사실, drop = FALSE'이어야합니다. (그냥 테스트 해 보았습니다.)'sorted.data <- x [order (x [[ncol (x)]),, drop = FALSE]'. –

+1

물론 ... 양쪽면을 테스트하여 잘못된 것을 복사/붙여 넣기했는지 확인해 주셔서 감사합니다. – r2evans

답변

2

먼저 데이터는 data.frame과 매우 흡사합니다. 이는 list과 매우 비슷합니다. 실제로 data.frame이 아닌 경우 쉼표 색인 생성 (x[order(x[[max.column]]), ])이 작동해서는 안되므로 data.frame이라고 가정합니다. 내가 data.frame 색인 (및 array의도)와 때때로 좌절 찾을

한 가지, 기본 동작은 (help("[")에서 추출) "결과가 가장 낮은 차원에 강요한다"는 것이다. 즉, 인덱싱 결과가 하나의 열 (또는 행)에 불과하면 벡터로 반환됩니다. 이를 선점하려면 색인에 ,drop=FALSE을 추가

x[order(x[[max.column]]),,drop=FALSE] 

(감사 루이 Barradas에 위 내 잘못된 설명을 수정합니다.)