2017-11-13 15 views
0

많이 확인했는데 비슷한 질문이 있지만 간단한 것을 이해할 수는 없습니다. 다른 야구 직책에 대한 평균 급여를 계산하려고합니다.NaN 결과 tapply를 사용하여 계산할 때

library(Lahman) 
library(tidyverse) 

data("Fielding") 
data(Salaries) 

# First, I need to merge two datasets 
merged.df <- merge(Fielding, Salaries, by = "playerID", na.rm = TRUE) 
merged.df.2002 <- merged.df[merged.df$yearID.x == "2002",] 

# Let's try tapply 
mean.salary <- tapply(merged.df.2002$POS, merged.df.2002$salary, mean, na.rm = TRUE) 
# So it gives me an error 
# In mean.default(X[[i]], ...) : 
# argument is not numeric or logical: returning NA 

class(merged.df.2002$POS) 
class(merged.df.2002$salary) 

# Very likely POS column is factor for some reason. 
# Coerce them through 
merged.df.2002$POS <- as.numeric(as.character(merged.df.2002$POS)) 
# Warning message: 
# NAs introduced by coercion 
merged.df.2002$salary <- as.numeric(as.character(merged.df.2002$salary)) 
#as.numeric(merged.df.2002$salary) 
class(merged.df.2002$salary) 

# Let's try tapply again 
mean.salary <- tapply(merged.df.2002$POS, merged.df.2002$salary, mean, na.rm 
= TRUE) 
mean.salary 

60000 62500 63500 65000 67000 67500 68000 68750 70000 
71000 72500 77500 78000 80000 82000 82500 
NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  
NaN  NaN  NaN  NaN  NaN  NaN 

아이디어가 있으십니까? 많은 감사합니다!

+5

빈 세트의 평균을 망쳐 NaN이입니다. 특히 mean (NA, na.rm = TRUE)은 NaN입니다. – Hugh

+1

덜 관련 :'na.rm'은'merge' 함수의 인자가 아닙니다. – lmo

+0

@Hugh, 귀하의 초고속 답변에 많은 감사드립니다. 따라서이 실수에서 내 실수는 어디에 있습니까? – Oleksiy

답변

0

글쎄, 쉽게,하지만 내가

merged.df <- merge(Fielding, Salaries) 
# So, my mistake was that I merged only by playerid. 

merged.df.2002 <- merged.df[merged.df$yearID == 2002, ] 
# we pick 2002 year from the merged dataset 

# use tapply for mean 
merged.df.mean <- tapply(merged.df.2002$salary, merged.df.2002$POS, mean, 
na.rm = TRUE) 

#  1B  2B  3B  C  OF  P  SS 
# 2543845 1400543 1547836 1787933 2659230 2150887 1979732