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?

经过思考,我找到了它,并创建了一个小函数:

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)

最新更新