R语言 如何基于另一个数据框的列名重命名因子?

mec1mxoz  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(93)

我在数据框中有一列包含主题:

sub <- c("A", "A", "B", "C", "C", "C", "D", "E", "F", "F")
subjects <- data.frame(sub)

我有另一个包含主题列的数据框(其中主题仅在一列中找到):

one <- c("A", "C", "F")
two <- c("B", "D", NA)
three <- c("E", NA, NA)
newsubjects <- data.frame(one, two, three)

我希望将第一个 Dataframe 中的主题重命名为第二个 Dataframe 中与该主题对应的列名。
例如,我想将第一个数据框中的A、C和F主题重命名为“one”。手动执行此操作将花费很长时间,因此我希望有一种方法可以使用第二个数据框中的列来执行此操作。
我尝试了很多forcats::fct_recode和levels的方法,但是没有任何效果,因为我没有正确使用这些函数。例如IIRC我的一个尝试看起来是这样的:

subjects %>%
      mutate(new_var = forcats::fct_recode(sub,
            !!! setNames(as.character(subjects$sub), newsubjects$one)))

我知道这是完全错误的。问题的一部分是我很难用一种返回相关搜索结果的方式表达我的问题。谢谢你能提供的任何帮助,我很感激。

flvlnr44

flvlnr441#

使用purrr::map(),派生一个将列名与newsubjects中的值配对的列表。然后在forcats::fct_collapse()中将其解包,以重新编码subjects中的值。
第一个

kdfy810k

kdfy810k2#

如果将newsubjects的形状调整为更长,则可以连接两个表:

library(tidyverse)
subjects %>%
  left_join(newsubjects %>% 
            pivot_longer(everything(), names_to = "new_sub", values_to = "sub")) 

Joining, by = "sub"
   sub new_sub
1    A     one
2    A     one
3    B     two
4    C     one
5    C     one
6    C     one
7    D     two
8    E   three
9    F     one
10   F     one
fkaflof6

fkaflof63#

在一、二、三等长的基础上还可以创建查找

library(dplyr)

sub <- c("A", "A", "B", "C", "C", "C", "D", "E", "F", "F")
subjects <- data.frame(sub)

one <- c("A", "C", "F")
two <- c("B", "D", NA)
three <- c("E", NA, NA)

additions <- c(one, two, three)

lookup <- data.frame(
  sub = additions %>% unlist(), 
  value = rep(1:length(additions), each=length(additions[[1]])))

subjects %>% inner_join(lookup) %>% select(value)
jv2fixgn

jv2fixgn4#

以R为底:

gsub("\\d", "", names(unlist(newsubjects))[match(subjects$sub, unlist(newsubjects))])

相关问题