希望使用grep从环境中获取 Dataframe 名称,然后在R中使用rbind函数堆叠行

x8diyxa7  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(100)

我有上千个 Dataframe ,想把它们的名字grep成一个字符向量。然后用这个向量完成rbind函数。有什么建议吗?

dat1lkq6 <- data.frame(color = c('COLOR: RED', 'COLOR: RED', 'COLOR: BLUE', 'COLOR: GREEN', 'COLOR: BLUE'))
dat1ah2 <- data.frame(style = c('SPORTY', 'HYBRID', 'FORMAL', 'CASUAL', 'CASUAL'))
dat29fg <- data.frame(color = c('COLOR: RED', 'COLOR: CYAN', 'COLOR: BLUE', 'COLOR: RED', 'COLOR: BLUE'))
dat2xl <- data.frame(color = c('COLOR: RED', 'COLOR: CYAN', 'COLOR: BLUE', 'COLOR: RED', 'COLOR: BLUE'))
dat3g49 <- data.frame(color = c('COLOR: PURPLE', 'COLOR: RED', 'COLOR: BLUE', 'COLOR: GREEN', 'COLOR: BLUE'))
skus4 <- data.frame(sku = c('SKU: 1849354', 'SKU: 392856', 'SKU: 921385', 'SKU: 6395474', 'SKU: 8532449', 'SKU: 0285468', 'SKU: 2948327'))

#grep to get only "dat" dataframe names
all_dat_df <- base::ls(all.names = TRUE)[base::grep("^dat", base::ls(all.names = TRUE))]

#want to stack all the "dat" df's into one df, but not working
#result dataframe should have 25 rows
rbind(all_dat_df)

#tried various incarnations of dput, gsub, paste, noquote to no success
0md85ypi

0md85ypi1#

使用grep()value = TRUE获取匹配的对象名称。然后使用mget()从环境中获取关联的 Dataframe 列表。最后,您可以使用dplyr::bind_rows()或可能的do.call(rbind)合并成一个。

library(dplyr)

grep("^dat", ls(), value = TRUE) |>
  mget() |>
  bind_rows()
style         color
1  SPORTY          <NA>
2  HYBRID          <NA>
3  FORMAL          <NA>
4  CASUAL          <NA>
5  CASUAL          <NA>
6    <NA>    COLOR: RED
7    <NA>    COLOR: RED
8    <NA>   COLOR: BLUE
9    <NA>  COLOR: GREEN
10   <NA>   COLOR: BLUE
11   <NA>    COLOR: RED
12   <NA>   COLOR: CYAN
13   <NA>   COLOR: BLUE
14   <NA>    COLOR: RED
15   <NA>   COLOR: BLUE
16   <NA>    COLOR: RED
17   <NA>   COLOR: CYAN
18   <NA>   COLOR: BLUE
19   <NA>    COLOR: RED
20   <NA>   COLOR: BLUE
21   <NA> COLOR: PURPLE
22   <NA>    COLOR: RED
23   <NA>   COLOR: BLUE
24   <NA>  COLOR: GREEN
25   <NA>   COLOR: BLUE

我使用dplyr::bind_rows()是因为它可以处理 Dataframe 中列名不同的情况,如示例数据中的情况,如果列 * 没有 * 不同,并且您更喜欢基本R解决方案,则可以使用do.call(rbind)

grep("^dat", ls(), value = TRUE) |>
  mget() |>
  do.call(what = rbind)
niknxzdl

niknxzdl2#

您可以将ls中的pattern设置为^dat,以仅获取以dat开头的值。

all_dat_df <- ls(pattern = "^dat")
all_dat_df
#[1] "dat1ah2"  "dat1lkq6" "dat29fg"  "dat2xl"   "dat3g49"

#do.call(rbind, mget(all_dat_df)) #Does not work, as the named are not the same
do.call(dplyr::bind_rows, mget(all_dat_df))
#    style         color
#1  SPORTY          <NA>
#2  HYBRID          <NA>
#3  FORMAL          <NA>
#4  CASUAL          <NA>
#5  CASUAL          <NA>
#6    <NA>    COLOR: RED
#7    <NA>    COLOR: RED
#8    <NA>   COLOR: BLUE
#9    <NA>  COLOR: GREEN
#10   <NA>   COLOR: BLUE
#11   <NA>    COLOR: RED
#12   <NA>   COLOR: CYAN
#13   <NA>   COLOR: BLUE
#14   <NA>    COLOR: RED
#15   <NA>   COLOR: BLUE
#16   <NA>    COLOR: RED
#17   <NA>   COLOR: CYAN
#18   <NA>   COLOR: BLUE
#19   <NA>    COLOR: RED
#20   <NA>   COLOR: BLUE
#21   <NA> COLOR: PURPLE
#22   <NA>    COLOR: RED
#23   <NA>   COLOR: BLUE
#24   <NA>  COLOR: GREEN
#25   <NA>   COLOR: BLUE
wnvonmuf

wnvonmuf3#

首先,使用grep()函数获取保存data.frame的所有对象的名称,就像您已经在做的那样:

all_objects <- base::ls()
all_dat_df <- all_objects[base::grep("^dat", all_objects)]

现在,all_dat_df对象是一个字符向量,它包含一个对象名列表。但这些只是对象的名称,它没有引用这个对象的“位置”,它拥有的“什么”值等。
所以你需要将这些名称转换为你想要合并的对象/数据.frames的实际引用。为此,你要求R使用lapply()函数将这些对象收集到列表中。
lapply()函数将get()函数应用于all_dat_df中的每个对象名称。此get()函数将获取您使用对象名称引用的对象的实际引用。lapply()将仅将get()的结果存储在R列表中。

list_of_data_frames <- lapply(all_dat_df, get, envir = globalenv())

之后,你只需要在你收集的data.frames列表上应用dplyr::bind_rows()函数:

big_data_frame <- dplyr::bind_rows(list_of_data_frames)

现在,big_data_frame对象包含一个data.frame,其中包含grep()在全局环境中找到的所有data. frame中的所有行。

**注意:**要使用dplyr::bind_rows()函数,您需要在计算机中安装dplyr软件包。如果您没有安装此软件包,请使用下面的代码安装它:

install.packages("dplyr")

相关问题