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