首页 > 解决方案 > 随机重新编码每行中值的第一个和第二个实例?

问题描述

我有一个数据框,其中每行中有两个值的实例(比如值是 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”每一行的代码时遇到了麻烦。

有没有一种简单的方法可以做到这一点?

标签: r

解决方案


一个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

推荐阅读