2017-10-05 99 views
0

有3个数据帧。 ID变量位于每个数据帧的第12列。我创建了一个向量list_cc_q1,其中包含所有数据帧中的所有唯一ID(因此该向量中的每个条目都出现在至少一个数据帧的第12列中)。通过ID变量在数据帧之间求和变量

我希望创建,增加了,对于每个ID的向量v1,在从含有该ID的每个数据帧中的第七列中的值(因此v1将是相同长度的作为list_cc_q1)。下面是我使用的代码:我想我已经过于复杂的代码,一个简单的方法将是极大的帮助

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

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) }) 

这将返回以下错误。

但为什么不工作?

回答

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] 

这样可以将每三个data.frames(DF1,DF2,DF3)的第7列的值列和第12列每个data.frames(df1,df2,df3)添加到一个id列以形成一个data.table,其中包含两列(值和id)。然后它通过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

完美!你理解正确。通过使用ls(envir = .GlobalEnv)修正我的代码'[和另一个修正关于哪个']。但是你的代码片断要快2500倍。谢谢! –