2015-01-06 2 views
0

나는 데이터 프레임 생성 할 수 있습니다 하나 개의 기능, 프로그래밍 한 (이 기능은 지구 환경을 수정!)이 기능은이 같은 데이터 프레임을 생성R의 함수에서 데이터 프레임을 생성

abc=function(x,y) { 
    if(y>=11) 
    stop("Noooooooooooooooooooooooooope!") 
    value = NA 
    for (i in 1:10) { 
    a=2+i 
    b=3 
    value[i]=(x+a)*(b*y) 
    } 
    df=data.frame(ID=(1:10),Value=(value)) 
    assign("df",df,envir = .GlobalEnv) 
    View(df) 
} 
abc(2,9) 

을 :

ID Value 
1 1 135 
2 2 162 
3 3 189 
4 4 216 
5 5 243 
6 6 270 
7 7 297 
8 8 324 
9 9 351 
10 10 378 

하지만 이제 더 많은 열이 될 "큰"데이터 프레임을 만들어야합니다. 인수 abc (1,9), abc (2,9), abc (3,9) .... abc (13,9). 새 데이터 프레임은 다음과 같습니다.

ID Value1 Value2 Value3 ... 
1 1 108 135 ... 
2 2 135 162 ... 
3 3 162 189 ... 
4 4 189 216 ... 
5 5 216 243 ... 
6 6 243 ... ... 
7 7 270 ... ... 
8 8 297 ... ... 
9 9 324 ... ... 
10 10 351 ... ... 

어떻게 만들 수 있습니까?

+0

지구 환경을 수정하는 기능을 게시하면 사람들에게 경고하십시오 – Gregor

답변

0

함수의 데이터 프레임에서 ID 열을 제거하고 assign 호출 대신 returnvalue 벡터 만 제거 할 수 있습니다. 그런 다음이 방법으로 진행하십시오.

df<- data.frame(ID=1:10, Value1=abc(1,9), Value2=abc(2,9), Value3=abc(3,9)) 

"big"의 정의에 따라 이것은 비효율적이거나 가능하지 않을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다! 네, 좋은 해결책입니다. 나는 이것을 사용할 것이다. 많은 감사합니다! –

0

아니 나쁘지 가장 우아한 아니지만 : 나는 View 짜증나는 발견하기 때문에

먼저 나는 당신의 기능을 수정하고 훨씬 더 나은 무언가를 반환 명시 적으로보다는 글로벌 환경에서 그것을 스틱입니다 :

abc=function(x,y) { 
    if(y>=11) 
     stop("Noooooooooooooooooooooooooope!") 
    value = NA 
    for (i in 1:10) { 
     a=2+i 
     b=3 
     value[i]=(x+a)*(b*y) 
    } 
    df=data.frame(ID=(1:10),Value=(value)) 
    #assign("df",df,envir = .GlobalEnv) 
    #View(df) 
} 

이제 x = 1:13 그것을 실행하고 결과를 결합하는 :

dflist = lapply(1:13, abc, y = 9) 
for (i in seq_along(dflist)) { 
    names(dflist[[i]])[2] = paste0("Value", i) 
} 
bigdf = Reduce(function(...) merge(..., all = T), dflist) 
을3210

(방법을 사용하여 this answer)

+0

답변 해 주셔서 감사합니다. 나는 당신의 방법을 본다! 많은 감사합니다! 하지만 예! 고맙습니다! 내가 14 평판을 가지고 있기 때문에 나는 당신의 의견을 높이 지 못한다. 그러나 앞으로는 "위로"하고 싶습니다. –

관련 문제