我有一个名为'out'的数据框,其中包含以下字符串。
out<-data.frame(c("Normal","Normal","Abnormal","Normal","Abnormal","Abnormal","Normal","Abnormal"))
我想用从列表中采样的字符串替换“Normal”,如下所示
mychoices<-(x="Really bad",x="so so", x="Actually OK")
我试过了:
str_replace_all(out[,1],"Normal", as.character(sample(mychoices,1,replace=F)))
但它只替换了整个列表中的一个。我也尝试将它包装在一个函数中
out2 <- apply(out, 1, function(x) {
if (stringr::str_detect(x, "Normal")) {
return(str_replace_all(out[,1],"Normal", as.character(sample(mychoices,1,replace=F))))
}
})
但它返回数据框中的列表。
答案 0 :(得分:4)
这是做我认为你想要的一种方式。我稍微更改了您的数据结构,以便更轻松地使用(为列添加名称,并设置stringsAsFactors = FALSE
)
out <- data.frame(abornorm = c("Normal","Normal","Abnormal","Normal","Abnormal","Abnormal","Normal","Abnormal"), stringsAsFactors = FALSE)
out$abornorm[out$abornorm == "Normal"] <- sample(c("Really bad", "so so", "Actually OK"), sum(out$abornorm == "Normal", na.rm = TRUE), replace = TRUE)
如果您的源和目标长度相同,则可以利用分配矢量索引的功能。