通过 ID 变量对数据帧中的变量求和
Sum a variable across dataframes by an ID variable
有3个数据框。 ID 变量位于每个数据框的第 12 列。我创建了一个向量 list_cc_q1
,其中包含所有数据帧中的所有唯一 ID(因此该向量中的每个条目出现在至少一个数据帧的第 12 列中)。
我希望创建一个向量 v1
,它为每个 ID 添加来自包含该 ID 的每个数据帧的第 7 列中的值(因此 v1
将具有相同的长度如 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) })
此returns以下错误:
Error in get(y)[x, 12] : incorrect number of dimensions
Called from: which(get(y)[x, 12])
我认为我的代码过于复杂了,一个更简单的方法将非常有用。
但是为什么这不起作用?
不确定我是否理解正确,但是怎么样:
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 列以形成具有两列(值和 id)的 data.table。然后它按 id 列对 value 列求和。
编辑:您的代码可能无法正常工作,因为
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
有3个数据框。 ID 变量位于每个数据框的第 12 列。我创建了一个向量 list_cc_q1
,其中包含所有数据帧中的所有唯一 ID(因此该向量中的每个条目出现在至少一个数据帧的第 12 列中)。
我希望创建一个向量 v1
,它为每个 ID 添加来自包含该 ID 的每个数据帧的第 7 列中的值(因此 v1
将具有相同的长度如 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) })
此returns以下错误:
Error in get(y)[x, 12] : incorrect number of dimensions
Called from: which(get(y)[x, 12])
我认为我的代码过于复杂了,一个更简单的方法将非常有用。
但是为什么这不起作用?
不确定我是否理解正确,但是怎么样:
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 列以形成具有两列(值和 id)的 data.table。然后它按 id 列对 value 列求和。
编辑:您的代码可能无法正常工作,因为
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