r - 随机重新编码每行中值的第一个和第二个实例?
问题描述
我有一个数据框,其中每行中有两个值的实例(比如值是 34)。我想用 3 替换一个实例,用 4 替换另一个实例(没有替换,所以如果第一个实例得到 4,第二个实例得到 3。反之亦然。)我想随机分配任务(这样一些行使用 3 然后 4,其他行 4 然后 3。)
这是我的例子:
# sample data
df1 <- data.frame(a= c(1, 2, NA, NA),b= c(2, NA, 1, NA),c= c(NA, NA,34, 2),
d= c(NA, 34, NA,1),e= c(34, 34,2,34),f= c(34, 1, NA,NA),
g= c(NA, NA,34, NA), h= c(NA,NA, NA, 34))
> df1
a b c d e f g h
1 1 2 NA NA 34 34 NA NA
2 2 NA NA 34 34 1 NA NA
3 NA 1 34 NA 2 NA 34 NA
4 NA NA 2 1 34 NA NA 34
这是一个符合我目标的输出:
a b c d e f g h
1 1 2 NA NA 3 4 NA NA
2 2 NA NA 4 3 1 NA NA
3 NA 1 4 NA 2 NA 3 NA
4 NA NA 2 1 4 NA NA 3
到目前为止,在我的尝试中,我已经能够使用which()
with识别包含 34 的列apply()
indexes_34 <- apply(df1, 1, function(x) {which(x == 34)})
我随机生成了一个向量列表,其元素包含 3 和 4 或 4 和 3。
ord <- list()
for(i in 1:nrow(df1)){
ord[[i]] <- sample(c(3,4), 2)
}
但是我在编写将每个“ord”向量中的值分配给正确索引处的“df1”每一行的代码时遇到了麻烦。
有没有一种简单的方法可以做到这一点?
解决方案
一个dplyr
选项purrr
可能是:
df1 %>%
mutate(pmap_dfr(across(everything()),
~ `[<-`(c(...), which(c(...) == 34), sample(c(3, 4)))))
a b c d e f g h
1 1 2 NA NA 4 3 NA NA
2 2 NA NA 4 3 1 NA NA
3 NA 1 4 NA 2 NA 3 NA
4 NA NA 2 1 4 NA NA 3
推荐阅读
- visual-studio-code - VSCode 扩展:如何在输出通道中渲染彩色输出?
- python - 如何迭代defaultdict?
- javascript - 如何在鼠标滚动时折叠 Jquery 手风琴
- go - GOLANG - 将浮点数格式化为货币字符串(点为千位,逗号在小数点分隔符中)
- google-sheets - 如何更正 Google 表格中的解析错误?
- sql - 改进访问查询
- java - 增量实例变量不可用于下一个线程
- ruby - Rails Monkey Patch alias_method 导致无方法错误
- wpf - 为什么这个简单的 WPF ListView 示例会生成延伸到边框之外的文本?
- node.js - 如何使用 mongoose 将多个 refs 保存到 MongoDB 中的一个文档中?