使用 R 中其他数据框的行号创建数据框
Creating a dataframe by using row numbers of other data frames in R
我想知道在 R 中是否有一种方法可以使用具有相似名称的数据集。例如:
我有八个名为 cars_1995
、cars_new_1995
、cars_1996
、cars_new_1996
、cars_1997
、cars_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
备注:
ls()
对于这个例子很方便,因为它可以提取全局环境中的所有对象名称。
- 使用
str_extract
,我只提取了以 cars_[4 digits]
开头的对象名称,然后将结果输入 mget
mget
获取字符对象名称向量和 returns 命名列表中指定环境的值
lapply
用于提取列表的每个元素(数据集)中的行号。然后将其转换为 data.frame,每列对应一个行号。
gather
将 data.frame 从宽格式重塑为长格式。
mutate
和separate
中的正则表达式分别把名字从cars_1995_news
改成cars_new_1995
,分隔成cars_new
和year
- 最后的
spread
将 data.frame 重塑为所需的格式。
数据注意事项:
我使用 rnorm
和 sample
创建了玩具数据集, 没有 为它们分别设置种子。这意味着您将 而不是 得到与我这里相同的结果 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_new
到 cars_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)))
我想知道在 R 中是否有一种方法可以使用具有相似名称的数据集。例如:
我有八个名为 cars_1995
、cars_new_1995
、cars_1996
、cars_new_1996
、cars_1997
、cars_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
备注:
ls()
对于这个例子很方便,因为它可以提取全局环境中的所有对象名称。- 使用
str_extract
,我只提取了以cars_[4 digits]
开头的对象名称,然后将结果输入mget
mget
获取字符对象名称向量和 returns 命名列表中指定环境的值lapply
用于提取列表的每个元素(数据集)中的行号。然后将其转换为 data.frame,每列对应一个行号。gather
将 data.frame 从宽格式重塑为长格式。mutate
和separate
中的正则表达式分别把名字从cars_1995_news
改成cars_new_1995
,分隔成cars_new
和year
- 最后的
spread
将 data.frame 重塑为所需的格式。
数据注意事项:
我使用 rnorm
和 sample
创建了玩具数据集, 没有 为它们分别设置种子。这意味着您将 而不是 得到与我这里相同的结果 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_new
到 cars_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)))