对于每个组,从向量

时间:2018-06-05 15:23:16

标签: r dplyr

我正在尝试生成一个虚假的数据集进行测试。

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

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")

现在我需要再创建两列; &#34;阳性&#34;在&#34;访问&#34;和&#34;响应&#34;中为每个组提供特定值随机整数,其范围取决于&#34;中的每个组;访问&#34;。

对于&#34;积极性&#34;,我可以这样做:

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

和#34;响应&#34;,我可以这样做:

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)

但实际上我在&#34;访问&#34;中有更多独特的观察。比这还需要永远。我希望我可以使用dplyr和group_by循环遍历每个组并分配&#34; positivity&#34;从向量开始,因为该向量的长度应该等于&#34;中的组的数量&#34;并指定&#34;响应&#34;使用样本方法的范围向量。

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

以下是使用tidyverse的选项。使用&#39;访问&#39;的唯一值创建一个命名向量。 (当访问&#39;使用它来匹配访问元素并将其替换为匹配向量的NA,0,1时,不清楚如何更改值,然后{ {1}}数据通过&#39;访问&#39;,使用split来自相应map2的{​​{1}} <{1}}

sample