2014-10-24 4 views
0

에() lapply 사용하여 ID를 통해 반복 벡터 data과 함께 id를 통해 결과 벡터 (또는 행렬)의 모든 행에 id와 해당 결과가 포함되도록합니다. 나는이 같은 기능을 쓴 R

그래서 간단한 경우에이은 다음과 같습니다

myfunc <- function(id, data, c1, c2, c3) { 
      res <- data*c1*c2*c3 
      return(c(id, res)) 
      } 

하지만 그에 lapply를 사용하지 못할. 이미 apply를 사용하는 매트릭스 모든 입력 (id, data, c1, c2, c3)를 넣어 시도 :

apply(matrix, 1, myfunc) 

그러나 그것은 작동하지 않았다.

그래서 이것을 달성하는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

편집 :

 id data c1 c2 c3 
[1,] 32 1.12 2 2.5 2.8 
[2,] 33 1.14 2 2.5 2.8 
[3,] 34 1.21 2 2.5 2.8 
[4,] 35 1.22 2 2.5 2.8 
[5,] 36 1.27 2 2.5 2.8 
[6,] 37 1.30 2 2.5 2.8 
[7,] 38 1.32 2 2.5 2.8 
[8,] 39 1.36 2 2.5 2.8 
[9,] 40 1.44 2 2.5 2.8 
[10,] 41 1.45 2 2.5 2.8 

열 ID를 통해 루프 취득하여야하며,이 myfunc이 다른 컬럼에 적용한다 :

이 데이터 매트릭스 수 있습니다. 내가 (또는 수요) 결과이 같은 기대 :

 id res 
[1,] 32 15.68 
[2,] 33 15.96 
[3,] 34 16.94 
[4,] 35 17.08 
[5,] 36 17.78 
[6,] 37 18.20 
[7,] 38 18.48 
[8,] 39 19.04 
[9,] 40 20.16 
[10,] 41 20.30 
+0

우리가 (예상 결과) 재현 예를 가질 수 있습니까? –

답변

0

이유는 다음 dataframe에서 데이터를 가지고 있지 :

> ddf$res = with(ddf, data*c1*c2*c3) 
> ddf 
     id data c1 c2 c3 res 
[1,] 32 1.12 2 2.5 2.8 15.68 
[2,] 33 1.14 2 2.5 2.8 15.96 
[3,] 34 1.21 2 2.5 2.8 16.94 
[4,] 35 1.22 2 2.5 2.8 17.08 
[5,] 36 1.27 2 2.5 2.8 17.78 
[6,] 37 1.30 2 2.5 2.8 18.20 
[7,] 38 1.32 2 2.5 2.8 18.48 
[8,] 39 1.36 2 2.5 2.8 19.04 
[9,] 40 1.44 2 2.5 2.8 20.16 
[10,] 41 1.45 2 2.5 2.8 20.30 
+0

나는 그 하나를 좋아한다, 어떤 추가 꾸러미도 필요하지 않다. –

+0

인내심을 버리지 말고;) 그냥 시도해야했습니다. –

0

내가 바보 인거야하지 않는 한이 매우 간단 할 수있다.

그래서 lapply를 사용하여 벡터 res을 만드는 방법을 알고 있습니까? ID 열과 함께하십시오. ID 순서가 같아서 ID가 일치합니다. 여기 data.table를 사용

cbind(data$id, res) 
+0

나는 그것에 대해 이미 생각했지만보다 우아한 방법을 찾고 있습니다. –

1

기능을 사용할 필요가, 데이터의 원자 예입니다

library(data.table) 

lst = list(id=c(32,33,34), data=c(1.12,1.14,1.21), c1=rep(2,3),c2=rep(2.5,3),c3=rep(2.8,3)) 
M = do.call(cbind, lst) 

#  id data c1 c2 c3 
#[1,] 32 1.12 2 2.5 2.8 
#[2,] 33 1.14 2 2.5 2.8 
#[3,] 34 1.21 2 2.5 2.8 

dt = as.data.table(M) 

우리는 진행할 수 :

dt[,res:=data*c1*c2*c3] 
as.matrix(dt[,list(id,res)]) 
#  id res 
#[1,] 32 15.68 
#[2,] 33 15.96 
#[3,] 34 16.94 
+0

사실,이 기능은 훨씬 더 복잡합니다. 저는 단지 상수와 하나의 벡터가 있음을 지적하고 싶었습니다. –

+0

f가 함수 인 경우 어디에 문제가 있는지 알 수 없습니다. dt [, res : = f (data, c1, c2, c3)] –

+0

괜찮습니다. 미안, 방금 못 봤어.실용적인 방법으로 보입니다 –

1

것은 개인적으로 오히려 할 것 그것과 함께 apply :

x <- data.frame(id = 32:41, 
       data = c(1.12, 1.14, 1.21, 1.22, 1.27, 1.3, 1.32, 1.36, 1.44, 1.45), 
       c1 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
       c2 = c(2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5), 
       c3 = c(2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8)) 
x$res <- apply(x[,-1],1,prod) 
x[, c("id", "res")] 
+0

그것이 내가 할 수있는 방법이다 –

관련 문제