2017-10-05 13 views
0

데이터 프레임이 3 개 있습니다. ID 변수는 각 데이터 프레임의 12 번째 열에 있습니다. 필자는 모든 데이터 프레임에 걸쳐 모든 고유 ID를 포함하는 벡터 list_cc_q1을 만들었습니다 (따라서이 벡터의 각 항목은 하나 이상의 데이터 프레임의 12 번째 열에 나타납니다).ID 변수로 데이터 프레임간에 변수 합계

는 I, 즉 ID를 포함하는 각 데이터 프레임으로부터 7 번째 열에있는 값 (따라서 v1list_cc_q1 같은 길이의 것) 각 ID에 대해, 추가 벡터 v1를 만들고자.

f1 <- function(x,y){ 
     ifelse(length(get(y)[which(get(y)[x,12]),7])>0, get(y)[which(get(y)[x,12]),7], 0)} 

g1 <- function(x){sum(sapply(ls()[1:3], function(y){ f1(x,y)}))} 

v1 <- sapply(list_cc_q1, function(z){ g1(z) }) 

이 다음과 같은 오류를 반환 :

Error in get(y)[x, 12] : incorrect number of dimensions 
Called from: which(get(y)[x, 12]) 

내가 코드, 간단한 방법은 대단히 도움이 될 것 overcomplicated 것 같아 여기에 내가 사용하고 코드입니다.

하지만 왜 작동하지 않습니까?

답변

1

나는 확실하지 올바르게 이해하지만 방법에 대해 :

library(data.table) 
dt <- data.table(value = c(df1[[7]],df2[[7]],df3[[7]]), id = c(df1[[12]],df2[[12]],df3[[12]])) 
dt[, .(sum = sum(value)), by = id] 

이 값 열과 12 열까지 세 data.frames (DF1, DF2, DF3)의 각각의 7 열을 연결 각각의 data.frames (df1, df2, df3)를 id 열로 연결하여 두 개의 열 (value 및 id)이있는 data.table을 만듭니다. 그런 다음 값 열을 id 열로 합합니다.

편집 : 귀하의 코드가 있기 때문에() 명령은 내가 올바르게 볼 경우 세 data.frames를 포함하지 않는 기능-환경에서 실행되는

ls()[1:3] 

은 ls의 작동하지 않을 수 있습니다. 다음을 비교해 보면 알 수 있습니다.

ls()[1:3] 
# [1] "df1" "df2" "df3" 
function_ls <- function(){cat(ls()[1:3])} 
function_ls() 
# NA NA NA 
+0

Perfect! 당신은 정확하게 이해합니다. 'ls (envir = .GlobalEnv)'와'which'에 관한 또 다른 수정을 사용하여 나의 코드를 수정했다. 하지만 코드 스 니펫은 2500 배 빠릅니다. 감사! –