通过ID变量对数据帧中的变量求和

时间:2017-10-05 12:53:02

标签: r sapply

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

我希望创建一个向量v1,为每个ID添加包含该ID的每个数据帧的第7列中的值(因此v1与{的长度相同{1}})。这是我正在使用的代码:

list_cc_q1

这会返回以下错误:

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 个答案:

答案 0 :(得分: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列连接到值列,并将每个data.frames(df1,df2,df3)的第12列连接到id列到形成一个包含两列(value和id)的data.table。然后它将值列与id列相加。

编辑:由于

,您的代码可能无效
ls()[1:3]

ls()命令在函数环境中执行,如果我没有正确看到,那么它不包含你的三个data.frames。您可以通过比较以下内容来看到这一点:

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