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

R 通过ID变量对数据帧中的变量求和,r,sapply,R,Sapply,有3个数据帧。ID变量位于每个数据帧的第12列。我创建了一个向量list_cc_q1,其中包含所有数据帧中的所有唯一ID(因此,该向量中的每个条目都显示在至少一个数据帧的第12列中) 我希望创建一个向量v1,为每个ID添加包含该ID的每个数据帧的第7列中的值(因此v1的长度与list\u cc\u q1)。以下是我使用的代码: f1 <- function(x,y){ ifelse(length(get(y)[which(get(y)[x,12]),7])>0, get(

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

我希望创建一个向量
v1
,为每个ID添加包含该ID的每个数据帧的第7列中的值(因此
v1
的长度与
list\u cc\u 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) })
我想我已经把代码复杂化了,一个更简单的方法将非常有用


但是为什么这不起作用呢?

我不确定我是否理解正确,但是:

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]
ls()命令是在不包含三个data.frames的函数环境中执行的,如果我没有看错的话。通过比较以下各项,您可以看到这一点:

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

功能完美!你理解对了。通过使用
ls(envir=.GlobalEnv)
[和另一个关于
的更正,其中
]。但是,您的代码片段要快2500倍。谢谢
ls()[1:3]
ls()[1:3]
# [1] "df1" "df2" "df3"
function_ls <- function(){cat(ls()[1:3])}
function_ls()
# NA NA NA