2012-01-31 4 views
1

이 코드는 R에서 일련의 곱셈과 덧셈을 수행합니다. 누군가가 * apply를 사용하여 더 깔끔하고 짧게 만들 것을 제안 할 수 있습니까?(데이터 프레임 내에서) mutiplication 코드를 R로 단축

"시리즈", "곱하기"와 같은 키워드로 둘러 보았지만 어디에도 없었습니다. 이 질문이 전에 게시 된 경우 링크를 알려주십시오. 고맙습니다.

df1n은> 78 변수 및 215 관찰을 갖는 data.frame입니다.

dff[,3]<-(df1n[5]*((df1n[25]*df1n[26]*df1n[27]) + (df1n[28]*df1n[29]*df1n[30]) + 
     (df1n[31]*df1n[32]*df1n[33]) + (df1n[34]*df1n[35]*df1n[36]) + 
     (df1n[37]*df1n[38]*df1n[39]) + (df1n[40]*df1n[41]*df1n[42]) + 
     (df1n[61]*df1n[62]*df1n[63]) + (df1n[64]*df1n[65]*df1n[66]) + 
     (df1n[67]*df1n[68]*df1n[69]) + (df1n[70]*df1n[71]*df1n[72]) + 
     (df1n[73]*df1n[74]*df1n[75]) + (df1n[76]*df1n[77]*df1n[78])) 
     ) 

감사합니다, 나는 (A*B*C) 조각의 각 지표의 목록을 구성 할 lapply()을 사용하십시오

+0

배열 인덱싱에 대한 논리가 있습니까? 너는 무엇을 얻으려고 하는가? – Moe

+0

안녕하세요, Moe는 data.frame의 다른 값을 기반으로 값을 계산하는 수식입니다. 제가 생각할 수있는 유일한 논리는 25에서 시작하여 다음 3 열의 곱셈을 한 다음 40까지 3 열의 다음 곱셈에 더한다는 것입니다. 그런 다음 다시 61로 돌아가서 clumn 76까지 같은 패턴을 반복합니다. 이것은 분명하다. 배열 인덱싱이라는 것을 알지 못했습니다. 고마워. – ikel

답변

3

ikel. 그런 다음 해당 색인을 sapply으로 전달하고 각 요소 집합을 df1n에서 추출한 다음 prod()을 곱합니다.

df1n <- 1:100 
ll <- lapply(c(seq(25, 40, by=3), seq(61, 76, by=3)), 
      function(X) seq(X, by=1, length.out=3)) 
df1n[5] * sum(sapply(ll, function(i) prod(df1n[i]))) 
# [1] 11439180 

편집 : 나머지는 자명하다 지금은 df1n의 각 요소는 길이 215 벡터 것을 알고, 여기에 코드의 내가 대신 좋을 것 :

# Example data (a list in which each element is a vector of length 215). 
x <- replicate(100, 1:215, simplify=FALSE) 
ll <- lapply(seq(25, 76, by=3), function(X) seq(X, by=1, length.out=3)) 
res <- x[[5]] * rowSums(sapply(ll, function(i) Reduce("*", x[i]))) 

str(res) 
# num [1:215] 18 288 1458 4608 11250 ... 
+0

안녕 조쉬, 그거 짧은 ~! 나는 그것을 시도하고 곧 알려 줄께 ~ – ikel

+0

@ikel - 나는 당신이 25에서 76까지 전체 시퀀스를 사용하지 않았다는 것을 놓쳤다. 나는 올바른 계산을하기 위해 그것을 지금 편집했다. 나의 최선의 충고는 조각들로 놀아서 그들이 어떻게 작동하는지 보는 것이다. 그리고이 방법이 효과가 있다면 왼쪽에있는 체크 표시를 클릭하여 답을 수락 할 수 있습니다. 행운을 빕니다! –

+0

실제로, 나의 df1 [5]와 다른 사람은 각각 215 개의 관측치를 가지고 있으며, 공식 (carefuly)을 적용하면 NA를 산출합니다. 다시 시도하고 알려 드리겠습니다. 나는 "찌르다"가 사용할 올바른 기능이라고 생각하지 않습니다. – ikel

2

아래 샘플 데이터에서 원래 코드와 동일한 출력을 생성하는 Josh 솔루션의 변형입니다.

# Some sample data 
df1n <- as.data.frame(lapply(1:80, function(i) seq(i, len=5))) 

df1n[5] * rowSums(sapply(c(seq(25,40,3), seq(61,76,3)), 
    function(i) df1n[[i]]*df1n[[i+1]]*df1n[[i+2]])) 
# c.5..6..7..8..9. 
#1   11439180 
#2   14386680 
#3   17580528 
#4   21032640 
#5   24755220 
+0

+1은 덜 혼란스럽고 어느 쪽의 대답보다 우수합니다. 아직도, 내가 그것을 얻을 때, 나는 결코'Reduce()'를 사용할 기회를 포기한 것처럼 보일 수있다 ... –

+0

@ 토미 - < +1]] * df1n [[i + 2]] ... 인간이 읽을 수있는^_ ^ – ikel

관련 문제