为多个数据帧和未列表的列表计算新属性

Nav*_*nth 6 r list lapply dataframe

我在R请求您帮助解决问题.我有如下给出的数据帧

df1

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

df2

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

1,2,3,4
Run Code Online (Sandbox Code Playgroud)

我需要对每个数据帧执行操作,如下所示

 df1$value <- 0.12*df1$a+0.24*df1$b+0.56*df1$c
Run Code Online (Sandbox Code Playgroud)

从另一个Stack Overflow应答中读取,建议放入所有数据帧的列表.我试图使用以下声明来这样做.有效

df_list <- list(ls(pattern='df*'))
Run Code Online (Sandbox Code Playgroud)

现在我无法使用lapply使用以下代码计算新属性

res <- lapply(dflist, function(x) {
          0.12*grep(x[[a]])+0.24*grep(x[[b]])+0.56*grep(x[[c]]))
          })
Run Code Online (Sandbox Code Playgroud)

执行上述操作后,我想在没有列表的情况下改造我的数据帧.

akr*_*run 2

在 中R,最好将 data.frames 保存在list. 如果我们确实需要更新全局环境中的 data.frames 对象,请在将 'df_list' 与 'value' 列进行 inglist2env之后使用。transform

df_list <- mget(ls(pattern='df\\d+'))
res <- lapply(df_list, transform, value = 0.12*a + 0.24*b + 0.56*c)
list2env(res, envir = .GlobalEnv)
df1
#  a b c d value
#1 1 2 3 4  2.28
#2 1 2 3 4  2.28
#3 1 2 3 4  2.28
 df2
#  a b c d value
#1 1 2 3 4  2.28
#2 1 2 3 4  2.28
#3 1 2 3 4  2.28
#4 1 2 3 4  2.28
Run Code Online (Sandbox Code Playgroud)

我们在usingls(pattern='df\\d+'))中获取字符串 ( )的值,然后循环遍历s ( ) ,在每个 中创建一个新列“value” ,最后用 更新全局环境中的对象。listmgetlistdata.framelapply(df_list, ...transformdata.framelist2env

数据

df1 <- structure(list(a = c(1L, 1L, 1L), b = c(2L, 2L, 2L), c = c(3L, 
3L, 3L), d = c(4L, 4L, 4L)), .Names = c("a", "b", "c", "d"),
 class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(a = c(1L, 1L, 1L, 1L), b = c(2L, 2L, 2L, 2L), 
c = c(3L, 3L, 3L, 3L), d = c(4L, 4L, 4L, 4L)), .Names = c("a", 
"b", "c", "d"), row.names = c(NA, -4L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)