2016-08-28 4 views
1

에서 작동하지 않는 나는 데이터 프레임 생성 :기능을 적용하는 것은 R

fy <- c(2010,2011,2012,2010,2011,2012,2010,2011,2012) 
company <-c("Apple","Apple","Apple","Google","Google","Google","Microsoft","Microsoft","Microsoft") 
revenue <- c(65225,108249,156508,29321,37905,50175,62484,69943,73723) 
profit <- c(14013,25922,41733,8505,9737,10737,18760,23150,16978) 
companiesData <- data.frame(fy, company, revenue, profit) 

내가 명령을 적용하여 새 열을 만들려고 오전 있지만 오류가 주어집니다 : 사람을

companiesData$Margin<-apply(companiesData,1,function(x){(x[4]/x[3])*100}) 

Error in x[4]/x[3] : non-numeric argument to binary operator

을 할 수 여기에 실수가 무엇인지 말해 주시겠습니까?

+0

왜 루핑을합니까? 이게 당신이 필요로 하는게 아닌가요? '100 * (회사 데이터 $ 이익/회사 데이터 $ 수익) ' – Sotos

답변

4

실수는 apply은 행렬의 첫번째 인수 강제 변환이다 및 companiesData 숫자 및 비 수치 변수를 가지므로 분할 비에 대해 정의되어 있지 않기 때문에, 모든 변수는 x/y 무효 인 조작으로 얻어진 비 수치로 변환 - 숫자 데이터.

해결책 :이 경우 apply이 필요하지 않습니다.

companiesData$Margin <- 100 * companiesData$profit/companiesData$revenue 

또는 동등

companiesData <- within(companiesData, Margin <- 100 * profit/revenue) 

당신이 원하는 것을 할.

+0

두 번째 옵션이 첫 번째 옵션보다 나은 이유는 무엇입니까? 성능 차이 또는 다른 이점이 있습니까? 내가 가독성을 말할 수있는 한 두 가지 사이에는 거의 같다. - – Sotos

+1

@Sotos 비록 성능에 차이가 없지만 '적용'에 대한 좋은 설명. 스타일과 가독성의 문제입니다. –

관련 문제