在列表内的 R 数据框中排列列顺序

问题描述 投票:0回答:1

我有一个包含多个数据框的列表。除了一个或多个具有其他变量的列之外,每个数据框都具有相同的列名称。我从另一个相关问题中获取了这个示例数据框。

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
r tidyverse
1个回答
0
投票

您需要的函数是

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
© www.soinside.com 2019 - 2024. All rights reserved.