2016-12-05 7 views
2

에 할당 된 데이터 내가 R.서브 세트 및 R

한다고 가정 내가 처음 열이 달의 이름 인 두 개의 열 dataframe를 가지고 데이터의 부분 집합 및 할당의 특정 유형에 무슨 일에 대한 확신입니다 두 번째 열은 일부 데이터입니다. 여기서 간단한 예제를 수행 하겠지만, 실제로 작업중인 데이터 프레임의 실제 행은 훨씬 큽니다.

x <- data.frame(c("october", "march", "february", "january"), rnorm(4), 
stringsAsFactors = FALSE) 
names(x) <- c("months", "value") 

는 안전 부분 집합 내가 완전히 일치가 존재하지 않는 경우에 발생하는 이해하지 않기 때문에 나는이에게 다음과 같은 방법으로?

x[x[,1] == "october",1] <- "01/10" 

의 데이터 값을 설정하는 것입니다 예를 들어 첫 번째 컬럼 :

x[x[,1] == "december",1] <- "01/12" 

X [X [1] == "12 월", 1] 반환

> x[x[,1] == "december",1] 
[1] months value 
<0 rows> (or 0-length row.names) 

R이 존재하지 않는 것에 대한 배정을 수락하는 이유는 무엇입니까? 이 사건에서 어떤 일이 발생하는지 명확히 이해할 수 없으며 예기치 않은 양도 또는 행동이 발생할 수 있다고 걱정됩니다. 누구든지이 부분을 좀 밝힐 수 있습니까?

+0

x [, 1]은 데이터 프레임을 반환합니다. drop = TRUE 인수를 사용하여 벡터로 만듭니다. –

+0

오른쪽에 "01/10"을 삽입 할 열을 지정할 수도 있습니다. 그렇지 않으면 두 열에 모두 복사됩니다. –

+0

방금 ​​@ joel.wilson을 수정했습니다. – Rafolks

답변

2

왜 R은 존재하지 않는 것에 대한 할당을 허용합니까?

다른 동작을보고 싶지 않습니다. 행이 수정되지 않은 상태에서 헤드 업을 얻고 싶다면, 방법은 하나 data.table과 같습니다

제공
library(data.table) 
setDT(x) 

x[ months == "december", months := "01/12", verbose = TRUE ] 

... 마지막 두 줄 말할 것을

Creating new index 'months' 
Starting bmerge ...done in 0.02 secs 
Detected that j uses these columns: months 
No rows match i. No new columns to add so not evaluating RHS of := 
Assigning to 0 row subset of 4 rows 

주 행이 수정되지 않았습니까?

이 콘솔 출력을 텍스트 파일 로그에 쓰면 "0 행 하위 집합에 지정"과 일치하는 인스턴스가 있는지 검사 할 수 있습니다. Jan Gorecki's dtq과 같은 "감사"패키지를 통해 수정 된 행에 대한 통계를 얻을 수도 있습니다.


이 구문이 작동하는 방법 :

the data.table package의 구문은 DT[where, select|update|do, by]입니다. 이 경우 "업데이트"를 수행하고 by 인수를 건너 뜁니다. 패키지를 사용하기로 선택한 경우 "시작하기"페이지를 권장합니다.

+0

오른쪽 부분이 표현식에서 평가되지 않는다면 의미가있다 :'x [x [, 1] == "12 월", 1] <- "01/12" 요소가 없으므로 12 월 데이터 프레임의 첫 번째 열에. – Rafolks

+0

나는 무엇이 일어 났는지에 대한 본질을 이해하려고 노력하고 있습니다. "후드 아래"에 무슨 일이 일어나는지 – Rafolks

+0

@Rafolks 특히 명확하지 않은 것이 있으면 알려주세요. data.table에 대한 더 나은 이해를 원하면 순서대로 비네팅을 살펴 보는 것이 좋습니다. https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank