根据一个变量的条件重新编码多个变量

时间:2019-01-14 16:13:47

标签: r

我想根据另一个变量中的值重新编码多个变量(其中约90个)。

这里是一个示例:

df <- data.frame(var1 = c(1,0,5,10,0), var2 = c(1:5), var3 = c(1:5), var4 = 
c(1:5), var5 = c(1:5), var6 = c(1:5), var90 = c(1:5))

df

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    2    2    2    2    2     2
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    5    5    5    5    5     5

当var1 = 0时,我想将var2重新编码为var90为0,否则保持原样。

我可以使用以下命令轻松地对单个变量进行重新编码:

df[df$var1 == 0, c("var2")] <- 0

我可以使用数字符号将其应用于多列:

df[df$var1 == 0, c(2:7)] <- 0

在这个小样本集上做得很好,这是预期的结果:

  var1 var2 var3 var4 var5 var6 var90
1    1    1    1    1    1    1     1
2    0    0    0    0    0    0     0
3    5    3    3    3    3    3     3
4   10    4    4    4    4    4     4
5    0    0    0    0    0    0     0

但是,在我的完整数据集(〜90个变量,90,000行)上,我不得不在大约20分钟后终止,因为它仍然没有运行(希望让它在几秒钟而不是几分钟内运行)。

关于如何有效进行此操作的任何想法?

3 个答案:

答案 0 :(得分:3)

我们可以使用set中的data.table来加快速度

library(data.table)
setDT(df)
for(j in 2:7) set(df, i = which(df$var1 == 0), j = j, value = 0)
df
#   var1 var2 var3 var4 var5 var6 var90
#1:    1    1    1    1    1    1     1
#2:    0    0    0    0    0    0     0
#3:    5    3    3    3    3    3     3
#4:   10    4    4    4    4    4     4
#5:    0    0    0    0    0    0     0

此外,我们可以使用lapply中的base R来避免创建大的逻辑矩阵

df[2:7] <- lapply(df[2:7], function(x) replace(x, df$var1 == 0, 0))

答案 1 :(得分:3)

使用import javax.inject.Inject import akka.stream.Materializer import play.api.Logger import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} class ContentTypeFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter { def apply(nextFilter: RequestHeader => Future[Result]) (requestHeader: RequestHeader): Future[Result] = { nextFilter(requestHeader).map { result => result.body.contentType match { case Some("text/plain") => // some exception handling / Logging case Some("..") => // ok result case None => // .. } } } }

dplyr

输出:

library(dplyr)

df %>%
  mutate_at(vars(var2:var90), funs(ifelse(var1 == 0, 0, .)))

答案 2 :(得分:3)

我们也可以使用一些数学方法

df[2:7] <- df[2:7] * +(df$var1 != 0)

#  var1 var2 var3 var4 var5 var6 var90
#1    1    1    1    1    1    1     1
#2    0    0    0    0    0    0     0
#3    5    3    3    3    3    3     3
#4   10    4    4    4    4    4     4
#5    0    0    0    0    0    0     0

对于分别等于0和不等于0的值,我们将var1转换为0、1,然后将这些值与其余列相乘,以便0值变为0,而非0值保持原样