代码之家  ›  专栏  ›  技术社区  ›  andrew_reece

map\u dfr:填充。具有字符串标签的id列,而不是没有字符串标签的索引。x已命名

  •  4
  • andrew_reece  · 技术社区  · 8 年前

    我想给 .id 的输出中的列条目 map_dfr 用单词代替索引值,但我的输入没有命名(即 how map accepts string values for .id )。

    将名称映射到 身份证件 本例中的字段?

    示例数据:

    n <- 20
    df <- data.frame(foo_1=rnorm(n), foo_2=rnorm(n), foo_3=rnorm(n), 
                     foo_a=runif(n), t_foo=runif(n),
                     bar_1=rnorm(n), bar_2=rnorm(n), bar_3=rnorm(n), 
                     bar_a=runif(n), t_bar=runif(n))
    

    二者都 foo bar 是心理测量量表,我想用 psych::alpha()
    只有相关列具有命名模式 foo_<int> (适用于 foo公司 比例)或 bar_<int> 对于 酒吧 缩放(因此下面的regex匹配)。

    事实上,我有很多音阶,每个音阶都有很多列。所以我想 地图 可能是进行计算的一种好方法,类似这样:

    require(psych)
    require(tidyverse)
    
    categories <- c("foo", "bar")
    
    categories %>%
      map_dfr(~df %>% 
                select(matches(paste0("^",.x,"_?\\d"))) %>% 
                do(psych::alpha(., check.keys=TRUE)$total), .id="scale") %>%
      select(scale, raw_alpha, std.alpha)
    
      scale raw_alpha std.alpha
    1     1 0.2275679 0.2791238
    2     2 0.4141225 0.4130054
    

    但我想 scale 获取值的步骤 foo公司 酒吧 :

      scale raw_alpha std.alpha
    1   foo 0.2275679 0.2791238
    2   bar 0.4141225 0.4130054
    

    在这个玩具示例中,只需手动创建 categories <- c(foo="foo", bar="bar") ,但有许多规模,需要付出太多的努力。

    我的一个想法是自动化 foo="foo" 通过以下方式接近 zip 从Python创建键值对向量,例如 c(scale_name="scale_name",...) ,但我不知道如何在R中做到这一点。无论如何,这种方法不是很好(尽管我很乐意只满足于功能)。

    对于如何最好地获得我想要的输出格式,有什么建议吗?

    1 回复  |  直到 8 年前
        1
  •  5
  •   camille    8 年前

    除非我遗漏了更复杂的问题,否则这是一个很容易解决的问题。您只需添加 mutate 内部 map_dfr ,因此您将根据传入的值创建一列 map\U dfr .你可以放下 .id 钻头并使用 变异 拨打电话进行 scale 柱我只是想展示一下 规模 scale_cat 肩并肩。

    library(tidyverse)
    
    set.seed(123)
    n <- 20
    df <- data.frame(foo_1=rnorm(n), foo_2=rnorm(n), foo_3=rnorm(n), 
                                     foo_a=runif(n), t_foo=runif(n),
                                     bar_1=rnorm(n), bar_2=rnorm(n), bar_3=rnorm(n), 
                                     bar_a=runif(n), t_bar=runif(n))
    
    categories <- c("foo", "bar")
    
    categories %>%
        map_dfr(~df %>% 
                            select(matches(paste0("^",.x,"_?\\d"))) %>% 
                            do(psych::alpha(., check.keys=TRUE)$total) %>%
                            mutate(scale_cat = .x), 
                        .id="scale") %>%
        select(scale, scale_cat, raw_alpha, std.alpha)
    #>   scale scale_cat raw_alpha std.alpha
    #> 1     1       foo 0.2606448 0.2601066
    #> 2     2       bar 0.4571981 0.4827263
    

    创建日期:2018年5月12日 reprex package (v0.2.0)。