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

函数从重复测量中生成多个变量

  •  1
  • aelhak  · 技术社区  · 7 年前

    我有5个测试结果的数据( pub1 pub5 )每个都取0到6之间的整数值,并在5个不同的年龄段重复。( age1 age5 )也就是说, PUB1 完成于 1岁 PUB5 完成于 5岁

    我需要创建6个新的列/变量( age_v1 age_v6 )这应该显示出一个人最初的年龄 pub :

    1. Age_v1:在任何 酒吧 变量
    2. Age_v2:在任何 酒吧 变量
    3. Age_v3:在任何 酒吧 变量
    4. Age_v4:在任何 酒吧 变量
    5. Age_v5:在任何 酒吧 变量
    6. Age_v6:在任何 酒吧 变量

    例如,对于单个X, age_v5 将等于 age3 如果他们第一次在 酒吧 变量在中 pub3

        #Simulate example data
        library(tidyverse)
        N <- 2000
        data <- data.frame(id = 1:2000,age1 = rnorm(N,6:8),age2 = rnorm(N,7:9),age3 = rnorm(N,8:10),
                   age4 = rnorm(N,9:11),age5 = rnorm(N,10:12),pub1 = rnorm(N,1:4),pub2 = rnorm(N,1:4),
                   pub3 = rnorm(N,1:4),pub4 = rnorm(N,1:4),pub5 = rnorm(N,1:4))
    
       data <- data %>% mutate_at(vars(starts_with("pub")), funs(round(replace(., .< 0, NA), 0)))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    我们可以更容易地创建数据,而不是多个步骤

    i1 <- grepl('^pub', names(data)) # index for pub columns
    i2 <- grepl('^age', names(data)) # index for age columns
    data[i1] <- lapply(data[i1], function(x) pmax(round(., 0), 0)) # data rounding
    # instead of NA values, replaced with 0 as it is easier to get the column index
    

    循环通过1:6,在 list ,提取与 first 与“pub”的每一行中的值匹配, cbind 并提取相应的“年龄”值。如果一行中没有匹配项,则它将是na(使用“j2”索引),并分配这些项以在“data”中创建新列。

    data[paste0("age_v", 1:6)] <- lapply(1:6, function(i) {
             j1 <- max.col(data[i1] == i, 'first')
             j2 <- rowSums(data[i1] == i) == 0
             data[i2][cbind(seq_len(nrow(data)), j1 *(NA^j2))]
      })
    
    推荐文章