我有一个包含多个数据框的列表.除了一个或多个具有其他变量的列之外,每个数据框都具有相同的列名.我从另外related question个数据框中提取了这个示例数据.

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)

如何重新排列列表中的每个数据框,以使数据集之间有固定的相互列顺序(姓名、性别、年龄),后跟不在数据框中相互共享的其他列?

我知道如何 for each 数据框安排列,但不确定如何为列表安排列.以及如何在每次不命名列的情况下执行此操作.

#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

推荐答案

您需要的函数是dplyr包中的relocate(),用map(purrr包)或lapply(基数R)迭代列表.既然你打了tidyverse分,我的答案就是map()分.

要查找数据帧之间的公共列名,您可以使用:

reduce(map(mylist, names), intersect) ## thanks @thelatemail in the comment
[1] "age"    "name"   "gender"

但既然你已经定义了col_arrangement个,我直接在下面的回答中包括了它:

library(tidyverse)

col_arrangement <- c("name", "gender", "age")

map(mylist, ~ relocate(.x, any_of(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

R相关问答推荐

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

是否可以 Select 安装不带文档的R包以更有效地存储?

无法在我的情节中表现出显着的差异

带有gplot 2的十字舱口

按R中的组查找相邻列的行累积和的最大值

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

从开始时间和结束时间导出时间

用预测NLS处理R中生物学假设之上的误差传播

在另一个函数中调用ggplot2美学

为什么我的基准测试会随着样本量的增加而出现一些波动?

将多列合并为单独的名称—值对

如何删除仅在数据集顶部和底部包含零的行

在GG图中绘制射线的自动程序

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

如何在R中使用hmm TMB提前一步预测观察到的状态?

在具有多个响应变量的比例堆叠条形图上方添加总计

如何在GALT包的函数&geom_x样条线中调整线宽

有毒元素与表观遗传年龄的回归模型

如何为包创建自定义roxygen2标签?

如何创建直方图与对齐的每月箱?