2012-03-14 6 views
4

요즘 apply과 관련하여 이상한 문제가 발생했습니다. 다음의 예를 생각해apply()가 모든 열에 대해 NA 값을 제공합니다.

set.seed(42) 
df <- data.frame(cars, foo = sample(LETTERS[1:5], size = nrow(cars), replace = TRUE)) 
head(df) 
    speed dist foo 
1  4 2 E 
2  4 10 E 
3  7 4 B 
4  7 22 E 
5  8 16 D 
6  9 10 C 

내가 그 data.frame의 각 컬럼에 함수 fun (예를 들어, mean)을 적용 할 apply를 사용하고 싶습니다. 단지 numeric 값을 포함하는 data.frame 경우에, 나는 어떤 문제가없는 : 내 data.frame 포함 numericcharacter 데이터를 시도 할 때

apply(cars, 2, mean) 
speed dist 
15.40 42.98 

그러나을은 실패 할 것 :

물론
apply(df, 2, mean) 
speed dist foo 
    NA NA NA 
Warning messages: 
1: In mean.default(newX[, i], ...) : 
    argument is not numeric or logical: returning NA 
2: In mean.default(newX[, i], ..) : 
    argument is not numeric or logical: returning NA     
3: In mean.default(newX[, i], ...) :        
    argument is not numeric or logical: returning NA 

, character 열에 대해 NA을 얻으려고했지만 어쨌든 numeric 열의 값을 가져오고 싶습니다. 여기 아주 분명 뭔가 빠진 것 같은 예감으로

sapply(df, class) 
    speed  dist  foo 
"numeric" "numeric" "factor" 

모든 포인터

주시면 감사하겠습니다!

> sessionInfo() 
R version 2.14.1 (2011-12-22) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.UTF-8  LC_COLLATE=en_GB.UTF-8  
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base 

답변

10

?apply 대한 설명의 첫 번째 문장 말한다

X 배열하지만 (예를 들면, 데이터 프레임과 같은) 비 - 널 희미 값을 갖는 클래스의 객체 없으면 asmatrix가 2 차원 (예 : 데이터 프레임)이거나 as.array 인 경우배열을 통해 강제로 변형하려고 시도합니다.

매트릭스는 R에서 단 하나의 유형일 수 있습니다. 데이터 프레임이 매트릭스로 강제 변환 될 때, 단일 문자 열이 있으면 모든 것이 문자로 끝납니다.

대체품에 대한 설명을 드리겠습니다. 여기에 나와 있습니다. 데이터 프레임은 실제로 목록 일 뿐이므로 각 열에 함수를 적용하려면 대신 lapply 또는 sapply을 사용하십시오.

3

apply은 매트릭스에서 작동하며 매트릭스는 모두 하나의 유형이어야합니다. 따라서 df은 행렬로 변형되고 문자를 포함하므로 모든 열이 문자가됩니다.

> apply(df, 2, class) 
     speed  dist   foo 
"character" "character" "character" 

, 당신이 원하는 것을 얻을 plyrcolwisenumcolwise 기능을 확인하십시오.

> numcolwise(mean)(df) 
    speed dist 
1 15.4 42.98 
2

data.frame의 열에 대해 기능을 적용하고 있습니다. 데이터 이후.

sapply(df, mean) 

speed dist foo 
15.40 42.98 NA 
Warning message: 
In mean.default(X[[3L]], ...) : 
    argument is not numeric or logical: returning NA 

그리고 당신은 평균 계산하기 전에 클래스 숫자를 테스트 익명 함수를 사용하여 경고 메시지를 제거 할 수 있습니다 :

sapply(df, function(x)ifelse(is.numeric(x), mean(x), NA)) 

speed dist foo 
15.40 42.98 NA 
+0

을 프레임 목록, 당신은 apply 대신 lapply 또는 sapply를 사용할 수있다 'suppressWarnings (sapply (df, mean))'을 사용하여 경고를 제거 할 수도 있습니다. 그러나 이것은 당신의 버전이 단지 우리가 알 수있는 경고를 억제 할 것이고 걱정하지 않기 때문에 모든 경고를 억제 할 것이므로 아마도 당신의 솔루션이 더 나은 것일 것입니다. – Dason

관련 문제