R嵌套多个if循环以生成新向量

R nested for multiple if loops to generate new vector

我有 20 个工人,每个工人执行 100 个任务。我已经为每个任务生成了真实答案,即

的 5 个答案中的 1 个
answers <- c("liver", "blood", "lung", "brain", "heart")
truth <- sample(answers, no.tasks, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))

我的数据集包含列 workerID、taskID、truth。现在我需要生成另一个向量,我在其中模拟工作人员将根据一定的概率回答什么。例如,如果我的任务 1,工人 1 的真相是 "liver",我希望工人 1 以高概率回答任务 1 "liver"。同样,对于所有 2000 个任务的五个答案中的每一个,我都希望工人回答。为此,我使用以下 for 和 if 循环。

for (i in nrow(dataSet)){
if (dataSet$truth[i] == "liver")
{
df <- (rep(sample(answers, no.tasks, prob = c(0.9, 0.02, 0.02, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "blood")
{ 
df <-  (rep(sample(answers, no.tasks, prob = c(0.02, 0.9, 0.02, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "lung")
{
df <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.9, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "brain")
{
df <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.9, 0.02), no.workers)))
} else if (dataSet$truth[i] == "heart")
{
df <-  (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.02, 0.9), no.workers)))
} else {
df <- (rep(sample(answers, no.tasks, prob = c(0.2, 0.2, 0.2, 0.2, 0.2), no.workers)))
}
}

但是,由于我的任务 1 的真相是大脑,输出向量 df 有很多答案 "brain"。有人可以提示这里出了什么问题吗?

考虑使用包含 1,000 个元素的基础字符向量的列表进行初始化。

df <- vector("list", 2000) 

for (i in 1:nrow(dataSet)){
if (dataSet$truth[i] == "liver")
{
df[[i]] <-(rep(sample(answers, no.tasks, prob = c(0.9, 0.02, 0.02, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "blood")
{ 
df[[i]] <-(rep(sample(answers, no.tasks, prob = c(0.02, 0.9, 0.02, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "lung")
{
df[[i]] <-(rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.9, 0.02, 0.02), no.workers)))
} else if (dataSet$truth[i] == "brain")
{
df[[i]] <-(rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.9, 0.02), no.workers)))
} else if (dataSet$truth[i] == "heart")
{
df[[i]] <-(rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.02, 0.9), no.workers)))
} 
}

或者,您可以使用 lapply(),它将输出与输入相同长度的列表向量(即 dataSet 的行),不需要初始化:

df2 <- lapply(seq_len(nrow(dataSet)), function(i){
  if (dataSet$truth[i] == "liver")
  {
  temp <- (rep(sample(answers, no.tasks, prob = c(0.9, 0.02, 0.02, 0.02, 0.02), no.workers)))
  } else if (dataSet$truth[i] == "blood")
  { 
  temp <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.9, 0.02, 0.02, 0.02), no.workers)))
  } else if (dataSet$truth[i] == "lung")
  {
  temp <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.9, 0.02, 0.02), no.workers)))
  } else if (dataSet$truth[i] == "brain")
  {
  temp <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.9, 0.02), no.workers)))
  } else if (dataSet$truth[i] == "heart")
  {
  temp <- (rep(sample(answers, no.tasks, prob = c(0.02, 0.02, 0.02, 0.02, 0.9), no.workers)))
  } 
  return(temp)
})

更好的是,您可以 trim 通过匹配 answers 向量中的当前 dataSet$truth 然后替换嵌套的 if 语句概率向量中对应的索引为 0.9:

df3 <- lapply(seq_len(nrow(dataSet)), function(i){
  probs <- c(0.02, 0.02, 0.02, 0.02, 0.2)      
  probs[match(dataSet$truth[i], answers)] <- 0.9

  temp <- (rep(sample(answers, no.tasks, prob = probs, no.workers)))
})