簡體   English   中英

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

我的dataSet包含workerID,taskID,true列。 現在,我需要生成另一個向量,在該向量中,我將基於某個概率來模擬工人將要回答的內容。 例如,如果我對任務1的真實性是工作人員1,則我希望工作人員1以高概率回答任務1的“肝臟”。 同樣,對於所有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有很多答案,都是“大腦”。 有人可以提示一下這里出了什么問題嗎?

考慮使用包含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)
})

更好的是,您可以通過匹配答案向量中的當前dataSet$truth ,然后用0.9替換概率向量中的相應索引,來減少嵌套的if語句:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM