我想对多个数据帧执行相同的操作-例如,将列“ A”除以1000,然后写为新列,称为“计算”。我已经在数据框列表上使用mapply和lapply找到了类似问题的许多答案,但是它们并没有更改实际的数据框,仅更改列表中的项。 我想修改原始数据框。另外,可能有数百个数据帧可以对其执行操作。
例如原始数据框:
df1
A
1
2
3
4
5
df2
A
10
11
12
13
14
15
所需的输出:
df1
A Calculation
1 0.001
2 0.002
3 0.003
4 0.004
5 0.005
df2
A Calculation
10 0.01
11 0.011
12 0.012
13 0.013
14 0.014
15 0.015
这看起来应该很简单,但我无法弄清楚。
答案 0 :(得分:2)
使用mget
获取列表中的所有数据框。如果您的数据称为df1
,df2
,则可以使用paste0
构造数据帧名称的字符串。对于更复杂的名称,您可以使用特定的模式来查找数据帧(类似df\\d+
的意思是df
,后跟数字)。
一旦数据在列表中,您就可以使用lapply
执行想要的计算,这将返回列表。
new_list <- lapply(mget(paste0('df', 1:2)), transform, Calculation = A/100)
要使用原始数据帧中的新列获取更改的数据帧,请使用list2env
。
list2env(new_list, .GlobalEnv)
答案 1 :(得分:0)
我认为您的问题出在您对data.frame而不是data.frame列表使用lapply的事实:
library(tidyverse)
df1 <- data.frame(x = 1:5)
df2 <- data.frame(x = 10:15)
df_list <- list(df1, df2)
lapply(df_list, function(.x) mutate(.x, calculation = X / 1000))
此代码返回所需数据的列表。帧
如果您想就地进行操作(尽管有副本),则可以在变异后添加分配,也可以使用data.table进行操作:
library(data.table)
df1 <- data.table(x = 1:5)
df2 <- data.table(x = 10:15)
df_list <- list(df1, df2)
lapply(df_list, function(.x) .x[, calculation := X / 1000])