2017-10-05 4 views
0

3つのデータフレームがあります。 ID変数は、各データフレームの12番目の列にあります。私はすべてのデータフレームのすべての固有IDを含むベクトルlist_cc_q1を作成しました(したがって、このベクトルの各エントリは、少なくとも1つのデータフレームの12番目の列に表示されます)。ID変数でデータフレーム間の変数を合計する

Iは、ID(したがってv1list_cc_q1と同じ長さであろう)ことを含む各データフレームから、IDごとに、7列の値を加算ベクトル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列に3 data.frames(DF1、DF2、DF3)のそれぞれの第七列を連結しますdata.frames(df1、df2、df3)のそれぞれをid列に変換して、2つの列(valueおよびid)を持つdata.tableを作成します。その後、値列をid列で合計します。

EDIT:あなたのコードが原因

ls()[1:3] 

のls()コマンドで動作しない可能性がありますが、私はこれを正しく見る場合は、あなたの3 data.framesが含まれていない機能の環境で実行されます。以下を比較すると分かります。

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

パーフェクト!あなたは正しく理解しています。 'ls(envir = .GlobalEnv)'を使ってコードを修正しました。しかし、コードスニペットは2500倍高速です。ありがとう! –

関連する問題