根据另一个df创建新变量

时间:2018-09-30 19:51:12

标签: r dplyr purrr

我正在尝试提高我的R游戏,显然我需要一些指导。我想创建很多变量(准确地说是93),但是我想这样做很聪明。但是我被卡住了。

我的问题:一个数据帧(df)包含一些变量,包括“主要”变量,其中包含我的描述变量的词干。另一个数据框(参考),更多是参考表,包含两列-类别和标识它的正则表达式;我只保留了3个条目,但最初保留了93个。

代码:

library(tidyverse)

df <- tibble("FlawType" = c(rep("Medium", 5), rep("Major", 5)),
         "Description" = c("utilizaca indev equip final divers daquel justific aquisica",
                           "utilizaca modal indev licitac aquisica mater previst plan trabalh conveni nomd",
                           "aquisica indev lanch gener alimentici secret municip educaca mont r",
                           "uso indev recurs bloc atenca basic aquisica medic realizaca trat intim prefeit decisa judic",
                           "indici irregular favorec process licitato no aquisica medic farmac basic raza concentraca indevid empr certam",
                           "localizaca bem vist realiz equip fiscalizaca cgu escol municip abril municipi palestin par",
                           "telecentr inat ausenc equip local instalaca equip defeit",
                           "equip local",
                           "equip mater permanent adquir implantaca banc aliment send utiliz outr local simples encontr in loc realiz equip",
                           "mater equip gener alimentici adquir recurs cra por entreg local atend"))

reference <- tibble(var = c("Aquisição indevida", "Equipamentos não localizados", "Despesa irregular"),
                    regex = c("(aquisica.*indev|indev.*aquisica)", "(equip.*local|local.*equip)", "(desp.*irregul|irregul.*desp)"))

kinda 可以在示例df中创建三个新变量,但事实证明它是一个列表,我必须提取它。我以为这不是问题,但是当我尝试运行其原始df(60k +行)时,它卡住了...

这个想法是:使用reference $ var作为每个新变量的名称,并使用关联的正则表达式(reference $ regex)为引用中的每个条目创建一个虚拟对象。

仅适用于示例但不适用于原始df 的代码,仅供参考:

varnames <- unique(reference$var)

for(varname in varnames){

  fd[[varname]] <- df %>% 
    mutate(!!paste0(varname) := ifelse(str_detect(df$Description, reference$regex), 1, 0))

}

df <- bind_cols(df, map_df(fd,3))

谢谢。

1 个答案:

答案 0 :(得分:2)

可能有一种更优雅的方法(我不喜欢在最后使用SELECT Accounts, [Plus / Negative], SUM(CurrentAmount) AS Toms FROM UserPivot WHERE parties = 'Toms' GROUP BY [Accounts], [Plus / Negative] WITH ROLLUP; 来恢复原始变量),但这应该可以工作:

bind_cols