从 global.env 调用 data.frame 并添加名称为 data.frame 的列
Calling a data.frame from global.env and adding a column with the data.frame name
我有一个由 data.frames 对组成的数据集(它们几乎是精确的对,但不足以直接合并),我需要将它们拼凑在一起。幸运的是,每个 df 都有一个创建日期的标识符,可用于引用该对。例如
df_0101 <- data.frame(a = rnorm(1:10),
b = runif(1:10))
df_0102 <- data.frame(a = rnorm(5:20),
b = runif(5:20))
df2_0101 <- data.frame(a2 = rnorm(1:10),
b2 = runif(1:10))
df2_0102 <- data.frame(a2 = rnorm(5:20),
b2 = runif(5:20))
因此,我需要做的第一件事是在包含此日期(01_01/ 01_02 / 等)的每个 data.frame 上改变一个新列,即
df_0101 <- df_0101 %>%
mutate(df_name = "df_0101")
但显然是以程序化的方式。
我可以使用
调用全局环境中的每个 data.frame
l_df <- Filter(function(x) is(x, "data.frame"), mget(ls()))
head(l_df)
$df_0101
a b
1 0.7588803 0.17837296
2 -0.2592187 0.45445752
3 1.2221744 0.01553190
4 1.1534353 0.72097071
5 0.7279514 0.96770448
$df_0102
a b
1 -0.33415584 0.53597308
2 0.31730849 0.32995013
3 -0.18936533 0.41024220
4 0.49441962 0.22123885
5 -0.28985964 0.62388478
$df2_0101
a2 b2
1 -0.5600229 0.6283224
2 0.5944657 0.7384586
3 1.1284180 0.4656239
4 -0.4737340 0.1555984
5 -0.3838161 0.3373913
$df2_0102
a2 b2
1 -0.67987149 0.65352466
2 1.46878953 0.47135011
3 0.10902751 0.04460594
4 -1.82677732 0.38636357
5 1.06021443 0.92935144
但不知道如何将每个 df 的名称下拉到每个 df 的新列中。有什么想法吗?
感谢阅读,
我们可以在base R
中使用Map
Map(cbind, names = names(l_df), l_df)
如果我们按tidyverse
方式进行,那么
library(tidyverse)
map2(names(l_df), l_df, ~(cbind(names = .x, .y)))
此外,这可以通过 bind_rows
创建单个数据集
bind_rows(l_df, .id = "names")
我有一个由 data.frames 对组成的数据集(它们几乎是精确的对,但不足以直接合并),我需要将它们拼凑在一起。幸运的是,每个 df 都有一个创建日期的标识符,可用于引用该对。例如
df_0101 <- data.frame(a = rnorm(1:10),
b = runif(1:10))
df_0102 <- data.frame(a = rnorm(5:20),
b = runif(5:20))
df2_0101 <- data.frame(a2 = rnorm(1:10),
b2 = runif(1:10))
df2_0102 <- data.frame(a2 = rnorm(5:20),
b2 = runif(5:20))
因此,我需要做的第一件事是在包含此日期(01_01/ 01_02 / 等)的每个 data.frame 上改变一个新列,即
df_0101 <- df_0101 %>%
mutate(df_name = "df_0101")
但显然是以程序化的方式。
我可以使用
调用全局环境中的每个 data.framel_df <- Filter(function(x) is(x, "data.frame"), mget(ls()))
head(l_df)
$df_0101
a b
1 0.7588803 0.17837296
2 -0.2592187 0.45445752
3 1.2221744 0.01553190
4 1.1534353 0.72097071
5 0.7279514 0.96770448
$df_0102
a b
1 -0.33415584 0.53597308
2 0.31730849 0.32995013
3 -0.18936533 0.41024220
4 0.49441962 0.22123885
5 -0.28985964 0.62388478
$df2_0101
a2 b2
1 -0.5600229 0.6283224
2 0.5944657 0.7384586
3 1.1284180 0.4656239
4 -0.4737340 0.1555984
5 -0.3838161 0.3373913
$df2_0102
a2 b2
1 -0.67987149 0.65352466
2 1.46878953 0.47135011
3 0.10902751 0.04460594
4 -1.82677732 0.38636357
5 1.06021443 0.92935144
但不知道如何将每个 df 的名称下拉到每个 df 的新列中。有什么想法吗?
感谢阅读,
我们可以在base R
Map
Map(cbind, names = names(l_df), l_df)
如果我们按tidyverse
方式进行,那么
library(tidyverse)
map2(names(l_df), l_df, ~(cbind(names = .x, .y)))
此外,这可以通过 bind_rows
bind_rows(l_df, .id = "names")