使用 R 中其他数据框的行号创建数据框

Creating a dataframe by using row numbers of other data frames in R

我想知道在 R 中是否有一种方法可以使用具有相似名称的数据集。例如:

我有八个名为 cars_1995cars_new_1995cars_1996cars_new_1996cars_1997cars_new_1997、[=17= 的数据集] 和 cars_new_1998 并且它们具有不同的尺寸,但我唯一想使用的是它们的行号。

所以我想创建一个新的数据框,rownames 将是年份 (1995,1996,1997,1998),colnames 将是组 (cars, cars_new)。数据框的维度将为 4:2。数据框的值将是行号,例如:

       Cars  Cars_new
  1995  25  76 
  1996  38  35 
  1997  87  49 
  1998  34  50

第一个问题是,在 R 中,有没有一种方法可以使用数据帧的名称,比如我需要获取 1995 年到 1999 年所有数据帧的行号(一列用于 cars_YEAR,另一列cars_YEAR_new 列)。顺便说一句,只有年份指标是数据框的名称。

我知道如何构建数据框或如何获取行号 (nrow) 但是,我还没有弄清楚如何仅使用数据框的嵌入年份来提取所有数据集' 名称 consecutively.So 如何通过在数据集名称中使用年份扩展来获取所有 cars_YEAR 数据集行号会很棒。

解决方案使用 stringr + dplyr + tidyr:

library(stringr)
library(dplyr)
library(tidyr)

ls() %>%
  str_extract("^cars_\d{4}.*") %>%
  na.omit() %>%
  mget(envir = globalenv()) %>%
  lapply(nrow) %>%
  data.frame() %>%
  gather(key, value) %>%
  mutate(key = str_replace(key, "(\d{4})_(.+)", "\2_\1")) %>%
  separate(key, c("key", "year"), "_(?=\d)") %>%
  spread(key, value)

结果:

  year cars cars_new
1 1995  114      102
2 1996  113       61
3 1997  168      186
4 1998  196       68

备注:

  1. ls() 对于这个例子很方便,因为它可以提取全局环境中的所有对象名称。
  2. 使用 str_extract,我只提取了以 cars_[4 digits] 开头的对象名称,然后将结果输入 mget
  3. mget 获取字符对象名称向量和 returns 命名列表中指定环境的值
  4. lapply 用于提取列表的每个元素(数据集)中的行号。然后将其转换为 data.frame,每列对应一个行号。
  5. gather 将 data.frame 从宽格式重塑为长格式。
  6. mutateseparate中的正则表达式分别把名字从cars_1995_news改成cars_new_1995,分隔成cars_newyear
  7. 最后的 spread 将 data.frame 重塑为所需的格式。

数据注意事项:

我使用 rnormsample 创建了玩具数据集, 没有 为它们分别设置种子。这意味着您将 而不是 得到与我这里相同的结果 data.frame。这没关系,因为实际的行号对于解决 OP 的问题并不重要。

数据:

# Create sample datasets
cars_1995 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1995_new = data.frame(A = rnorm(sample(50:200, 1)))
cars_1996 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1996_new = data.frame(A = rnorm(sample(50:200, 1)))
cars_1997 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1997_new = data.frame(A = rnorm(sample(50:200, 1)))
cars_1998 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1998_new = data.frame(A = rnorm(sample(50:200, 1)))

编辑(数据集名称从 cars_YEAR_newcars_new_YEAR):

ls() %>%
  str_extract("^cars_(new_)*\d{4}") %>%
  na.omit() %>%
  mget(envir = globalenv()) %>%
  lapply(nrow) %>%
  data.frame() %>%
  gather(key, value) %>%
  separate(key, c("key", "year"), "_(?=\d)") %>%
  spread(key, value)

使用新的数据集名称,可以删除 mutate + str_replace 步骤,并且还必须更改 str_extract 步骤,因为现在的模式不同了。

新数据:

# Create sample datasets
cars_1995 = data.frame(A = rnorm(sample(50:200, 1)))
cars_new_1995 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1996 = data.frame(A = rnorm(sample(50:200, 1)))
cars_new_1996 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1997 = data.frame(A = rnorm(sample(50:200, 1)))
cars_new_1997 = data.frame(A = rnorm(sample(50:200, 1)))
cars_1998 = data.frame(A = rnorm(sample(50:200, 1)))
cars_new_1998 = data.frame(A = rnorm(sample(50:200, 1)))