我想根据另一个变量中的值重新编码多个变量(其中约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分钟后终止,因为它仍然没有运行(希望让它在几秒钟而不是几分钟内运行)。
关于如何有效进行此操作的任何想法?
答案 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值保持原样