我有一个包含多个数据框的列表。除了一个或多个具有其他变量的列之外,每个数据框都具有相同的列名称。我从另一个相关问题中获取了这个示例数据框。
age <- c(20,30,22,32,10)
gender <- c('M','F','M','F','M')
name <- c('A','B','C','D','E')
salary <- c('800','400','300','670','790')
resident <- c('X','Y','Z','W','U')
ownership <- c('Yes','No','Yes','No','No')
df1 <- data.frame(age,name,gender,salary)
df2 <- data.frame(gender,name,age,resident,ownership)
> df1
age name gender salary
1 20 A M 800
2 30 B F 400
3 22 C M 300
4 32 D F 670
5 10 E M 790
> df2
gender name age resident ownership
1 M A 20 X Yes
2 F B 30 Y No
3 M C 22 Z Yes
4 F D 32 W No
5 M E 10 U No
mylist <- list(df1, df2)
如何重新排列列表内的每个数据框,以便在数据集中有一个固定的相互列序列(姓名、性别、年龄),后跟在数据框中不相互共享的其他列?
我知道如何为每个数据框排列列,但不知道如何为列表排列列。以及如何在每次不命名列的情况下做到这一点。
#if I rearrange column individually
df1 <- df1[, c("name", "gender", "age", "salary")]
#if I try by naming the mutual column, this will only select not arrange
col_arrangement <- c("name", "gender", "age")
df1 <- df1[, names(df1) %in% c(col_arrangement, "salary")]
这些数据框位于列表中的原因是稍后将它们全部写入单个 Excel 工作簿(有人告诉我使用 R 列表比更改单个数据框更好,但我根本不熟悉列表)。遗憾的是,我每次所做的都是重新排列 Excel 工作簿中每个工作表内的列。
我想要的输出,一个包含数据框和排列列的列表。
> df1
name age gender salary
1 A 20 M 800
2 B 30 F 400
3 C 22 M 300
4 D 32 F 670
5 E 10 M 790
> df2
name age gender resident ownership
1 A 20 M X Yes
2 B 30 F Y No
3 C 22 M Z Yes
4 D 32 F W No
5 E 10 M U No
您需要的函数是
relocate()
包中的 dplyr
,使用 map
(purrr
包)或 lapply
(基础 R)迭代列表。
library(tidyverse)
map(mylist, ~ relocate(.x, col_arrangement))
[[1]]
name gender age salary
1 A M 20 800
2 B F 30 400
3 C M 22 300
4 D F 32 670
5 E M 10 790
[[2]]
name gender age resident ownership
1 A M 20 X Yes
2 B F 30 Y No
3 C M 22 Z Yes
4 D F 32 W No
5 E M 10 U No