Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何修改多个数据帧而无需列出它们,然后使用Lappy?_R_List_Dataframe_Lapply - Fatal编程技术网

R 如何修改多个数据帧而无需列出它们,然后使用Lappy?

R 如何修改多个数据帧而无需列出它们,然后使用Lappy?,r,list,dataframe,lapply,R,List,Dataframe,Lapply,我有20个数据帧,在每个数据帧中,我希望以相同的方式格式化相同的列。当然,我可以制作dfs的列表,然后使用lappy。相反,我的目标是修改dfs,以便最终不必将其作为列表的元素访问,而是作为dfs访问。以下是一个例子: df1 <- data.frame(col1 = rnorm(5), col2 = rnorm(5)) df2 <- data.frame(col1 = rnorm(5), col2 = rnorm(5)) 但是现在df1返回原始df,而不是修改后的df。如何操作?

我有20个数据帧,在每个数据帧中,我希望以相同的方式格式化相同的列。当然,我可以制作dfs的
列表
,然后使用
lappy
。相反,我的目标是修改dfs,以便最终不必将其作为列表的元素访问,而是作为dfs访问。以下是一个例子:

df1 <- data.frame(col1 = rnorm(5), col2 = rnorm(5))
df2 <- data.frame(col1 = rnorm(5), col2 = rnorm(5))

但是现在
df1
返回原始df,而不是修改后的df。如何操作?

基于OP代码的一个选项是在命名
列表
元素后使用
list2env

names(df_list) <- paste0("df", 1:2)
list2env(df_list, envir = .GlobalEnv)

在这个问题上,你可以使用@g-grothendieck的黑客:

这样做:

list[df1, df2] <- lapply(list(df1, df2), function(df) {
          df$col1 <- df$col1 + 1
          return(df)
        })

list[df1,df2]您可以使用如下循环来避免函数(及其临时环境):

df1 <- data.frame(col1 = 1:5, col2 = rnorm(5))
df2 <- data.frame(col1 = rep(0, 5), col2 = rnorm(5))

df1 # before
for (d in c("df1", "df2")) {
  eval(parse(text = paste(d, "[['col1']] <- ", d, "[['col1']] + 1")))
}
df1 # after

df1如果您需要更新
df1
请在设置
df\u列表的名称后使用
list2env(df\u列表,envir=.GlobalEnv)
名称(df\u列表)为什么将它们作为单独的变量保持如此重要?为什么不先在列表中创建它们?在环境中对对象进行迭代需要。如果在列表中保留相关项目,一切都会正常工作。通过将dfs分开,我可以使用RStudio的data viewer。除此之外,显式子集(例如,
df$col1
)比子集复杂列表更方便。
list[df1, df2] <- lapply(list(df1, df2), function(df) {
          df$col1 <- df$col1 + 1
          return(df)
        })
list <- structure(NA,class="result")
"[<-.result" <- function(x,...,value) {
  args <- as.list(match.call())
  args <- args[-c(1:2,length(args))]
  length(value) <- length(args)
  for(i in seq(along=args)) {
    a <- args[[i]]
    if(!missing(a)) eval.parent(substitute(a <- v,list(a=a,v=value[[i]])))
  }
  x
}
df1 <- data.frame(col1 = rnorm(5), col2 = rnorm(5))
# col1       col2
# 1 -0.5451934  0.5043287
# 2 -1.4047701 -0.1184588
# 3  0.1745109  0.8279085
# 4 -0.5066673 -0.3269411
# 5  0.4838625 -0.3895784
df2 <- data.frame(col1 = rnorm(5), col2 = rnorm(5))
# col1        col2
# 1  0.4168078 -0.44654445
# 2 -1.9991098 -0.06179699
# 3 -1.0625996  1.21098946
# 4  0.4977718  0.45834008
# 5 -1.6181048  0.97917877

list[df1, df2] <- lapply(list(df1, df2), function(df) {
  df$col1 <- df$col1 + 1
  return(df)
})
# > df1
# col1       col2
# 1  0.4548066  0.5043287
# 2 -0.4047701 -0.1184588
# 3  1.1745109  0.8279085
# 4  0.4933327 -0.3269411
# 5  1.4838625 -0.3895784
# > df2
# col1        col2
# 1  1.41680778 -0.44654445
# 2 -0.99910976 -0.06179699
# 3 -0.06259959  1.21098946
# 4  1.49777179  0.45834008
# 5 -0.61810483  0.97917877
df1 <- data.frame(col1 = 1:5, col2 = rnorm(5))
df2 <- data.frame(col1 = rep(0, 5), col2 = rnorm(5))

df1 # before
for (d in c("df1", "df2")) {
  eval(parse(text = paste(d, "[['col1']] <- ", d, "[['col1']] + 1")))
}
df1 # after
df1 <- data.frame(col1 = 1:5, col2 = rnorm(5))
df2 <- data.frame(col1 = rep(0, 5), col2 = rnorm(5))

df1 # before
df2 # before
eval(parse(text = unlist(lapply(c("df1", "df2"), function(x) {
  expr.dummy <- quote(df$col1 <- df$col1 +1) # df will be replaced by df1, df2
  gsub("df", x, deparse(expr.dummy))
  }))))
df1 # after
df2 # after