2016-07-01 2 views
3

R에 SAS 데이터 세트를 읽는 중 SAS가 문자 값을 빈 따옴표로 저장했지만 고맙게도 zap_empty()이 해당 값을 NA로 변환합니다.tbl_df 열 클래스 식별

내 데이터 세트에는 거의 400 개의 변수가 포함되어 있으며 개별적으로 개별적으로 확인하지는 않을 것입니다. 변수가 문자인지 여부를 식별하고 zap_empty()을 적용하는 루프를 만들고 싶습니다.

read_sas()data.frame 대신 tbl_df으로 데이터를 가져옵니다. 데이터를 data.frame으로 먼저 변환하면 다음 루프가 작동합니다.

tbl_df을 사용하여 부울 테스트로 열 클래스를 식별하는 방법을 알고 싶습니다. 다음은 haven에서 read_sas()을 사용하여 읽은 SAS 데이터 세트의 예입니다.

> wolves <- read_sas('http://psych.colorado.edu/~carey/Courses/PSYC7291/DataSets/SAS/wolves.sas7bdat') 
> 
> # The first 3 variables are characters 
> glimpse(wolves) 
Observations: 25 
Variables: 13 
$ location (chr) "rm", "rm", "rm", "rm", "rm", "rm", "rm", "rm", "rm"... 
$ wolf  (chr) "rmm1", "rmm2", "rmm3", "rmm4", "rmm5", "rmm6", "rm"... 
$ sex  (chr) "m", "m", "m", "m", "m", "m", "f", "f", "f", "m", "m"... 
$ x1  (dbl) 126, 128, 126, 125, 126, 128, 116, 120, 116, 117, 1... 
$ x2  (dbl) 104, 111, 108, 109, 107, 110, 102, 103, 103, 99, 10... 
$ x3  (dbl) 141, 151, 152, 141, 143, 143, 131, 130, 125, 134, 1... 
$ x4  (dbl) 81.0, 80.4, 85.7, 83.1, 81.9, 80.6, 76.7, 75.1, 74.... 
$ x5  (dbl) 31.8, 33.8, 34.7, 34.0, 34.0, 33.0, 31.5, 30.2, 31.... 
$ x6  (dbl) 65.7, 69.8, 69.1, 68.0, 66.1, 65.0, 65.0, 63.8, 62.... 
$ x7  (dbl) 50.9, 52.7, 49.3, 48.2, 49.0, 46.4, 45.4, 44.4, 41.... 
$ x8  (dbl) 44.0, 43.2, 45.6, 43.8, 42.4, 40.2, 39.0, 41.1, 44.... 
$ x9  (dbl) 18.2, 18.5, 17.9, 18.4, 17.9, 18.2, 16.8, 16.9, 17.... 
$ subject (dbl) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ... 
> 
> # But my loop cannot identify that 
> for (i in 1:ncol(wolves)){ 
+ if (is.character(wolves[,i])){ 
+  print('bar') 
+ } else {print('foo')} 
+ } 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 
[1] "foo" 

나는 그것이 문자로 식별됩니다 $를 사용하여 열을 액세스하지만, 색인을 사용하지 않을 경우

.

> class(wolves$sex) 
[1] "character" 
> class(wolves[,'sex']) 
[1] "tbl_df"  "data.frame" 

어떻게 문자 변수가 tbl_df 물체로부터 열을있는 식별 할 수있는 루프를 사용하십니까?


@Sumedh부터 어떤 열이 문자인지 식별 ​​할 수있게되었습니다.
이 오류는 zap_empty()을 반복해서 사용할 수 없다는 것을 의미합니까?

> for (i in seq(which(sapply(wolves, class) == 'character'))){ 
+ wolves[,i] <- zap_empty(wolves[,i]) 
+ } 
Show Traceback 

Rerun with Debug 
Error: is.character(x) is not TRUE 
+0

, 내가 사용할 때 '클래스

x <- as.data.frame(mydf) for (i in seq(ncol(x))) { if(is.character(x[,i][[1]])){ x[,i] <- zap_empty(x[,i][[1]]) } } 

은보다 효율적이고 철저하게 여기에 데이터 과학 책의 R에 설명되어 (늑대 [, 'sex'])', 나는 "문자"를 출력으로 얻는다. – Sumedh

+0

그냥 재검사를했는데 여전히 ""tbl_df ""data.frame "'을 얻는다. 나는 haven_0.2.0.9000과 dplyr_0.4.3을 가지고 있습니다. –

+0

'haven 0.2.0'과'dplyr 0.4.3'을 통해 올바른 결과를 얻었습니다. – Jaap

답변

1

단일 열 데이터 프레임이 아닌 문자 벡터에서 is.character(x)을 테스트하고 싶습니다.

is.character(x[,i])은 대괄호 하위 태그가 항상 같은 유형의 개체를 반환하기 때문에 문자를 올바르게 검사하지 않습니다. x은 데이터 프레임이기 때문에 x[,i]도 데이터 프레임입니다. 문자 벡터를 얻으려면 [[1]]을 사용하여 x[,i]의 단일 열 데이터 프레임에서 첫 번째 벡터를 선택합니다. 루프없이이 작업을 수행하는 http://r4ds.had.co.nz/vectors.html#recursive-vectors-lists

한 가지 방법 : 참고로

character_vars <- lapply(x, class) == "character" 
x[, character_vars] <- lapply(x[, character_vars], zap_empty)