我在数据框架中有一个列,其中包含主题:
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)
我想将第一个数据框中的主题重命名为与该主题对应的第二个数据框中的列名。
例如,我希望将第一个数据帧中的A、C和F主题重命名为"one"。手动执行此操作需要很长时间,所以我希望有一种方法可以使用第二个数据帧中的列来完成此操作。
我已经尝试了一堆的东西与forcats::fct_recode和水平,但没有工作,因为我没有正确使用这些函数。我的一个尝试看起来像这样:
subjects %>%
mutate(new_var = forcats::fct_recode(sub,
!!! setNames(as.character(subjects$sub), newsubjects$one)))
我知道这是完全错误的。部分问题是我很难用一种返回相关搜索结果的方式来表达我的问题。谢谢你能提供的任何帮助,我很感激。
使用purrr::map()
,从newsubjects
中获得一个列名称与值配对的列表。然后将其解包到forcats::fct_collapse()
中以重新编码subjects
中的值。
library(purrr)
library(forcats)
new_ids <- map(newsubjects, ~ .x[!is.na(.x)])
subjects$sub <- fct_collapse(subjects$sub, !!!new_ids)
subjects
sub
1 one
2 one
3 two
4 one
5 one
6 one
7 two
8 three
9 one
10 one
如果您重塑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
在1、2、3等长度的基础上,还可以创建查找
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)
In base R:
gsub("\d", "", names(unlist(newsubjects))[match(subjects$sub, unlist(newsubjects))])