gpt4 book ai didi

使用数据框名称重命名列表内数据框的列

转载 作者:行者123 更新时间:2023-12-02 02:17:31 28 4
gpt4 key购买 nike

我有多个具有相同结构但内容不同的数据帧/标题。他们的名字是我区分他们的唯一方法。目标是将它们全部合并到一个数据框中,并带有一个因子列。原始数据框每个小时/测量有一列,所以首先我想收集所有内容。

想象 mtcars df 的第 5 到 11 列是我的小时列。

mt1 <- mtcars
mt2 <- mtcars
mt3 <- mtcars
mt4 <- mtcars

mtlist <- list(m1 = mt1,
m2 = mt2,
m3 = mt3,
m4 = mt4)

require(tidyverse)

mtlist_tidy <- lapply(mtlist, function(x){
df <- x %>%
gather(exp, temp_name, 5:11)

return(df)
})

现在我被困住了。我需要使用该 df 的名称(即 m1、m2 等)重命名 mtlist_tidy 内每个 df 中的“temp_name”列:

> head(mtlist_tidy$m1)
mpg cyl disp hp exp temp_name
1 21.0 6 160 110 drat 3.90
2 21.0 6 160 110 drat 3.90
3 22.8 4 108 93 drat 3.85
4 21.4 6 258 110 drat 3.08
5 18.7 8 360 175 drat 3.15
6 18.1 6 225 105 drat 2.76

应该变成

> head(mtlist_tidy$m1)
mpg cyl disp hp exp m1
1 21.0 6 160 110 drat 3.90
2 21.0 6 160 110 drat 3.90
3 22.8 4 108 93 drat 3.85
4 21.4 6 258 110 drat 3.08
5 18.7 8 360 175 drat 3.15
6 18.1 6 225 105 drat 2.76

然后 purrr::reduce(mtlist_tidy, full_join) 就可以工作,完成我的任务。

我想必须有一个仅使用 purrr 并跳过 lapply 的解决方案,但我对这个包还不太熟悉。

最佳答案

一些想法:

首先,要解决当前的问题,您可以使用 map2 同时循环列表和列表名称。然后,您可以通过 gather_ 使用列表名称来命名新列(用于标准评估)。

map2(mtlist, names(mtlist), ~gather_(.x, "exp", .y, names(.x)[5:11]) )

请注意,purrr 的下一个版本将使用 imap 作为循环列表和列表名称的快捷方式。此外,tidyr 的下一个版本将使用 tidyeval,并且 gather_ 将被弃用。

其次,您可以通过使用 map_df 进行循环而不是 lapply 来保持长格式。 map_df 在后台使用 bind_rows,您可以通过 .id 参数为每​​个列表包含一个分组变量。

mtlist %>%
map_df(~.x %>% gather("exp", "temp_name", 5:11), .id = "name" )

要将数据集设置为宽格式,您可以使用spread。在这个示例中需要做更多的工作,因为一些标识变量(例如 hpdisp)在多行中具有相同的值。

mtlist %>%
map_df(~.x %>% gather("exp", "temp_name", 5:11), .id = "name" ) %>%
group_by(name) %>%
mutate( rows = 1:n() ) %>%
spread(name, temp_name)

关于使用数据框名称重命名列表内数据框的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45374422/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com