大家好,我正在研究如何按列匹配数据帧,然后重命名它.如果没有匹配的名称,那么我想删除该列.

例如,我会使用这个主数据集,称之为DF1:

Name Reference Good Fair Bad Great Poor
George Hill 34 21 33 21 32
Frank Stairs 29 28 29 30 29
Bertha Trail 25 25 24 21 26

然后是另一个DF,称为DF2,它允许我替换DF1列的名称

Name Adjusted_Name
Good good_run
Great very_great_work
Bad bad run
Fair fair run decent

本质上,将被替换的单词不会是任何类型的模式,我会try 匹配DF2中的第一列,并与DF1匹配,如果DF2$Name和DF(任何列)中有匹配项,那么我将用同一行DF2$Adjusted_Name替换该名称.如果不匹配,则删除DF1中的值.

因此,最终目标将是实现:

Name Reference good_run fair run decent Bad run very_great_work
George Hill 34 21 33 21
Frank Stairs 29 28 29 30
Bertha Trail 25 25 24 21

在本例中,"poor"被删除,因为它与DF1的列名不匹配.

我该怎么做?如果有成千上万的专栏,我该如何解释?这会改变我的编码方式吗?我对R有点陌生,如有任何建议,我将不胜感激.非常感谢.

推荐答案

如果你愿意接受tidyverse种解决方案,你可以使用

library(dplyr)
library(tibble)

df %>% 
  rename_with(~deframe(df2)[.x], .cols = df2$Name) %>% 
  select(Name, Reference, any_of(df2$Adjusted_Name))

这又回来了

# A tibble: 3 x 6
  Name   Reference good_run very_great_work bad_run fair_run_decent
  <chr>  <chr>        <dbl>           <dbl>   <dbl>           <dbl>
1 George Hill            34              21      33              21
2 Frank  Stairs          29              30      29              28
3 Bertha Trail           25              21      24              25

数据

df <- structure(list(Name = c("George", "Frank", "Bertha"), Reference = c("Hill", 
"Stairs", "Trail"), Good = c(34, 29, 25), Fair = c(21, 28, 25
), Bad = c(33, 29, 24), Great = c(21, 30, 21), Poor = c(32, 29, 
26)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-3L), spec = structure(list(cols = list(Name = structure(list(), class = c("collector_character", 
"collector")), Reference = structure(list(), class = c("collector_character", 
"collector")), Good = structure(list(), class = c("collector_double", 
"collector")), Fair = structure(list(), class = c("collector_double", 
"collector")), Bad = structure(list(), class = c("collector_double", 
"collector")), Great = structure(list(), class = c("collector_double", 
"collector")), Poor = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))

df2 <- structure(list(Name = c("Good", "Great", "Bad", "Fair"), Adjusted_Name = c("good_run", 
"very_great_work", "bad_run", "fair_run_decent")), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), spec = structure(list(
    cols = list(Name = structure(list(), class = c("collector_character", 
    "collector")), Adjusted_Name = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))

R相关问答推荐

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

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

使用gcuminc,如何使用逗号格式化风险表?

如何在一次运行中使用count进行多列计数

标识R中多个列中缺少的唯一值

将一个字符串向量调整为与其他字符串向量完全相同的大小

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

将多个变量组合成宽格式

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

无法将条件case_when()应用于使用!!创建的新变量Mutations

判断函数未加载R中的库

以任意顺序提取具有多个可能匹配项的组匹配项

R:如何在数据集中使用Apply

删除列表中的奇数长度元素

判断列集是否以任意顺序按行顺序在R中相同

为哑铃图准备日期数据

按组判断值是否再次出现