【问题标题】:For each group assign different values from vector对于每个组,从向量中分配不同的值
【发布时间】:2018-06-05 15:23:16
【问题描述】:

我正在尝试生成一个用于测试的假数据集。

生成所有组合中存在的列很容易:

subject <- 1:5
visit <- c("D0", "D100", "D500")
isotype <- c("IgG", "IgA", "IgM", "IgD)

testdata <- expand.grid(subject, visit, isotype)

names(testdata) <- c("subject", "visit", "isotype")

现在我需要再创建两列; “积极性”对“访问”中的每个组具有特定值,“响应”使用随机整数,其范围取决于“访问”中的每个组。

对于“积极性”,我可以这样做:

testdata[testdata$visit == "D0", c("positivity")] <- NA
testdata[testdata$visit == "D100", c("positivity")] <- 1
testdata[testdata$visit == "D500", c("positivity")] <- 0

对于“响应”,我可以这样做:

testdata[testdata$visit == "D0", c("response")] <- sample(1:100, 1)
testdata[testdata$visit == "D100", c("response")] <- sample(20000:30000, 1)
testdata[testdata$visit == "D500", c("response")] <- sample(1:100, 1)

但实际上,在“访问”中,我有更多独特的观察结果,而这将永远持续下去。我希望我可以使用 dplyr 和 group_by 循环遍历每个组并从向量中分配“积极性”,因为该向量的长度应该等于“访问”中的组数并使用范围向量分配“响应”为样本方法。

positivityvalues <- c(NA, 1, 0)
responseranges <- c(1:100, 1:500, 1:100)


testdata <- testdata %>%
            group_by(visit) %>%
            mutate(#i can't figure out what to put here
            #positivity[1] = positivityvalues[1] etc...
            #response[1] = sample(responseranges[1], 1) etc...
            )

为了得到这样的东西(为了清楚起见,只列出了前两个主题和同种型)

subject    visit    isotype    positivity    response
  1         D0       IgG          NA           58
  1         D100     IgG          1            27093
  1         D500     IgG          0            2   
  1         D0       IgA          NA           42
  1         D100     IgA          1            28921
  1         D500     IgA          0            85      
  2         D0       IgG          NA           86
  2         D100     IgG          1            26039
  2         D500     IgG          0            54   
  2         D0       IgA          NA           99
  2         D100     IgA          1            29021
  2         D500     IgA          0            23  

谢谢

编辑*完成的更新

Edit2* 解决方案:

ranges <- list(D0=c(1:100), D100=c(25000:32000), D500=c(1:100))
positives <- c(D0=NA, D100=1, D500=0)

testdata$positivity <- positives[testdata$visit]
testdata$responsetemp <- ranges[testdata$visit] 
testdata$reponse <- lapply(testdata$responsetemp, function(x) sample(x, 1))

【问题讨论】:

  • 你能提供你预期的输出吗?
  • 您需要更改列名
  • 如果访问列的唯一值比较多,对应的值应该是多少
  • 更新列名并添加示例输出

标签: r dplyr


【解决方案1】:

您可以使用命名向量来做到这一点...

testdata <- expand.grid(subject=subject, visit=visit, isotype=isotype) 
                                   #this way to get column names

positivityvalues <- c(D0=NA, D100=1, D500=0) #add names

testdata$positivity <- positivityvalues[testdata$visit] #adds value by name

您可以对 response 列中的 sample 函数的参数执行类似的操作。

【讨论】:

  • 谢谢,这很简单!
【解决方案2】:

这是一个使用tidyverse 的选项。创建一个具有唯一值 'visit' 的命名向量(不清楚当 'visit' 中有更多唯一元素时如何更改值。使用它来匹配访问元素并将其替换为 NA, 0, 1匹配的向量,然后split '访问'的数据,使用map2sample 来自对应的rangevector

library(tidyverse)
v1 <- setNames(c(NA, 1, 0), as.character(unique(testdata$visit)))
testdata %>% 
     mutate(positivity = v1[visit]) %>% 
     split(.$visit) %>%
     map2_df(., list(1:100, 20000:30000, 1:100), ~ 
           .x %>% 
           mutate(response = sample(.y, n())))

【讨论】:

  • 在阅读了有意义的方法之后,我应该研究一下 tidyverse。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多