首页 > 解决方案 > R将虚拟变量转换为因子变量

问题描述

我有一个面板数据集,其中时间和组变量已经转换为虚拟变量。我想将转换反转为简单idtime可变的。

让我们创建一个可比较的数据:

library(plm)
library(tidyverse)
library(fastDummies)
data(EmplUK)

EmplUK %>%
  select(-sector) %>% 
  dummy_cols(.data = .,select_columns = c("firm","year"),remove_selected_columns = TRUE,remove_first_dummy = TRUE) -> paneldata
head(paneldata)

所以基本上现在我所有的虚拟变量都是firm_X和year_X,我想再次拥​​有一个Year和Firm变量。 由于公司 1 和第 1 年不作为虚拟存在(因为它们在回归模型中不需要),这一事实稍微复杂了一点。我对缺少这些精确数据感到满意(我可以简单地推断第一家公司是公司 1,而年份是 1976 年,比最小的公司少一个)。

任何想法如何很好地做到这一点?理想情况下使用 tidyverse?

标签: rpaneldummy-variable

解决方案


经过一番思考,我想通了,并创建了一个小函数:

getfactorback <- function(data,
                           groupdummyprefix,
                           timedummyprefix,
                           grouplabel,
                           timelabel,
                           firstgroup,
                           firsttime) {
  
  data %>% 
    mutate(newgroup = ifelse(rowSums(cur_data() %>% select(starts_with("id")))==1,0,1),
           newtime = ifelse(rowSums(cur_data() %>% select(starts_with("time")))==1,0,1)) %>%
    
    rename(!!paste0(groupdummyprefix,firstgroup):=newgroup,
           !!paste0(timedummyprefix,firsttime):=newtime) %>%
    
    
    pivot_longer(cols = starts_with(groupdummyprefix),names_to = grouplabel,names_prefix = groupdummyprefix) %>%
    filter(value == 1) %>%
    select(-value) %>%
    
    pivot_longer(cols = starts_with(timedummyprefix),names_to = timelabel,names_prefix = timedummyprefix) %>%
    filter(value == 1) %>%
    select(-value)  %>%
    
    mutate(across(.cols = c(all_of(grouplabel),all_of(timelabel)),factor)) %>%
    relocate(all_of(c(grouplabel,timelabel))) -> output
  
  return(output)
  
}

getfactorback(data = paneldata,
              groupdummyprefix = "firm_",
              grouplabel = "firm",
              timedummyprefix = "year_",
              timelabel = "year",
              firstgroup = "1",
              firsttime = 1976)

推荐阅读