【问题标题】:Generating new variables using for loop and mutate function in R在 R 中使用 for 循环和 mutate 函数生成新变量
【发布时间】:2018-08-28 20:13:27
【问题描述】:

假设我有一个如下所示的数据框:

fact_code style_serial ss rib button rib_s button_s
1008      style_1018   1   0  0      1     1 
1008      style_1018   0   1  0      1     1
1008      style_1018   0   1  0      1     1
1008      style_1018   0   0  1      1     1 
1008      style_1003   1   0  1      0     1
1008      style_1003   0   0  1      0     1
1008      style_1003   0   0  0      0     1
1008      style_1003   0   0  0      0     1
1004      style_1197   1   0  0      1     0 
1004      style_1197   0   0  0      1     0
1004      style_1197   0   0  0      1     0
1004      style_1197   0   1  0      1     0

关键变量 rib 和 button 是虚拟变量。它们表明工厂生产的特定服装款式是否有罗纹或纽扣或两者都有。然后我想取这些虚拟变量中的最大值,这些虚拟变量按fact_codestyle_serial 分组,在这种情况下,我将它们命名为rib_sbutton_s

变量rib_sbutton_s生成如下:

df <- df %>% group_by(fact_code, style_serial) %>% mutate(rib_s = max(rib, na.rm = TRUE))
df <- df %>% group_by(fact_code, style_serial) %>% mutate(button_s = max(button, na.rm = TRUE))

现在假设我有大约 20 个这样的变量。我想创建一个循环,该循环运行的次数与变量数量一样多,并且每次都为 20 个虚拟变量中的每一个执行上述代码。

我已经对 2 个变量进行了测试:

for (xx in c("rib", "button")){
df <- df %>%
group_by_(fact_code, style_serial) %>%
yy <- paste0(c(xx, "s"), collapse = "_") %>%
mutate_(yy = max(xx, na.rm = TRUE))
}

但它给了我以下错误信息:

Error in UseMethod("mutate_") : no applicable method for 'mutate_' applied to an object of class "character"

我也尝试过基本 r 函数,例如 tapplyaggregate,但总是收到一些错误消息。

你有办法解决这个问题吗?

【问题讨论】:

    标签: r loops for-loop dplyr


    【解决方案1】:

    这可以使用dplyr::mutate_at 非常简洁地解决:

    library(dplyr)
    key <- c("rib", "button")
    df %>%
        group_by(fact_code, style_serial) %>%
        mutate_at(vars(key), funs(max = max(.)))
    ## A tibble: 12 x 9
    ## Groups:   fact_code, style_serial [3]
    #   fact_code style_serial    ss   rib button rib_s button_s rib_max button_max
    #       <int> <fct>        <int> <int>  <int> <int>    <int>   <dbl>      <dbl>
    # 1      1008 style_1018       1     0      0     1        1      1.         1.
    # 2      1008 style_1018       0     1      0     1        1      1.         1.
    # 3      1008 style_1018       0     1      0     1        1      1.         1.
    # 4      1008 style_1018       0     0      1     1        1      1.         1.
    # 5      1008 style_1003       1     0      1     0        1      0.         1.
    # 6      1008 style_1003       0     0      1     0        1      0.         1.
    # 7      1008 style_1003       0     0      0     0        1      0.         1.
    # 8      1008 style_1003       0     0      0     0        1      0.         1.
    # 9      1004 style_1197       1     0      0     1        0      1.         0.
    #10      1004 style_1197       0     0      0     1        0      1.         0.
    #11      1004 style_1197       0     0      0     1        0      1.         0.
    #12      1004 style_1197       0     1      0     1        0      1.         0.
    

    这会自动计算key 中给定变量的最大值(每组),并通过将_max 附加到相应的列名来创建新列。请注意,如果您不想(或不能)定义,也可以在vars(...) 中使用通常的select 语义(例如containsmatchesstarts_withends_with 等)事先key


    样本数据

    df <- read.table(text =
        "fact_code style_serial ss rib button rib_s button_s
    1008      style_1018   1   0  0      1     1
    1008      style_1018   0   1  0      1     1
    1008      style_1018   0   1  0      1     1
    1008      style_1018   0   0  1      1     1
    1008      style_1003   1   0  1      0     1
    1008      style_1003   0   0  1      0     1
    1008      style_1003   0   0  0      0     1
    1008      style_1003   0   0  0      0     1
    1004      style_1197   1   0  0      1     0
    1004      style_1197   0   0  0      1     0
    1004      style_1197   0   0  0      1     0
    1004      style_1197   0   1  0      1     0", header = T)
    

    【讨论】:

    • key % group_by(fact_code, style_serial) %> % mutate_at(.vars = key, funs(max(., na.rm = T)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多