【问题标题】:Function to generate several variables from repeated measures从重复测量中生成多个变量的函数
【发布时间】:2018-12-20 22:14:32
【问题描述】:

我的数据显示了 5 次测试(pub1pub5)的结果,每个测试都取 0 到 6 之间的整数值,并且在 5 个不同年龄重复(age1age5)。也就是说,pub1 是在 age1 完成的....pub5 是在 age5 完成的

我需要创建 6 个新列/变量(age_v1age_v6),这些列/变量应该显示一个人第一次获得一定分数 pub 的年龄:

  1. age_v1:在任何 pub 变量上首次出现值 1 时的年龄
  2. age_v2:在任何 pub 变量上首次出现值 2 时的年龄
  3. age_v3:在任何 pub 变量上首次出现值 3 时的年龄
  4. age_v4:在任何 pub 变量上首次出现值 4 时的年龄
  5. age_v5:在任何 pub 变量上首次出现值 5 时的年龄
  6. age_v6:在任何pub 变量上首次出现值 6 时的年龄

例如,对于单个 x,age_v5 将等于 age3,如果他们第一次在任何 pub 变量上得分为 5 位于 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)))

【问题讨论】:

  • 从描述中不清楚你想要什么作为输出?最初,我以为您想一步创建列,但是在查看您的描述时,它有点不同。你能显示预期的输出吗
  • 谢谢 - 我稍微编辑了我的问题,希望能让我的观点更清楚。我希望一步创建列,新列应采用不同的 age1:age5 值,具体取决于 pub1:pub5 中特定值的第一次出现
  • 我认为最好有一个小例子并显示相应的预期输出。您显示的输入数据可以使用data %&gt;% mutate_at(vars(starts_with("pub")), funs(round(replace(., .&lt; 0, NA), 0))) 创建
  • 在要创建的列中,是二进制列/列还是与之对应的年龄值,??令人困惑
  • 新列应该是年龄值 - 它们应该采用年龄值

标签: r functional-programming dplyr data-manipulation


【解决方案1】:

我们可以更轻松地创建数据,而不是许多步骤

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中,提取对应'pub'每一行的值的first对应的列索引,cbind用行索引,提取对应的'age ' 价值。如果一行中没有匹配项,则为 NA(使用“j2”索引)并分配这些以在“数据”中创建新列

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))]
  })

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2015-02-16
    • 2023-03-22
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2021-01-29
    • 2016-06-11
    相关资源
    最近更新 更多