R将虚拟变量转换为因子变量
R transform dummies into factor variable
我有一个面板数据集,其中时间和组变量已经转换为虚拟变量。我想反转转换为简单的 id
和 time
变量。
让我们创建一个可比较的数据:
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)
我有一个面板数据集,其中时间和组变量已经转换为虚拟变量。我想反转转换为简单的 id
和 time
变量。
让我们创建一个可比较的数据:
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)