根据R中的变量更有效地重构数据帧行

时间:2017-03-03 11:03:00

标签: r dataframe

我有观察恶意软件的数据框。其中1个变量是类型。因为类型变量包含类型的组合(例如:adware ++ trojan)。出于某种原因,我需要根据类型复制这些观察结果,同时给每个重复观察每个反汇编类型。例如,1次观察:

     apksha                  time            type    market
8AB46C4A8AC   2013-09-23 16:04:24   adware++virus   1mobile

我希望它像:

     apksha                  time            type    market
8AB46C4A8AC   2013-09-23 16:04:24          adware   1mobile
8AB46C4A8AC   2013-09-23 16:04:24           virus   1mobile

我现在正在使用嵌入式for循环执行此任务:

newData <- data.frame()
combinedTypes <- grep("\\+", types, value=TRUE, perl=TRUE)
ctData <- rawData[rawData$type %in% combinedTypes, ]
for(i in 1:nrow(ctData)){
    type <- ctData[i, ]$type
    newTypes <- unlist(strsplit(type, "\\+\\+"))
    for(t in newTypes){
        nr <- ctData[i, ]
        nr$type <- t
        newData <- rbind(newData, nr)
    }
}
rawData <- rawData[!(rawData$type %in% combinedTypes), ]
rawData <- rbind(rawData, newData)

问题是R运行嵌入式循环的速度非常慢。所以想知道这项任务是否有更好的解决方案?

发现一种肮脏而快速的方式:

splitedtype <- strsplit(rawData$type, "\\+\\+")
dataNew <- rawData[rep(seq_len(nrow(rawData)), lengths(splitedtype)), ]
dataNew$type <- unlist(splitedtype)

2 个答案:

答案 0 :(得分:0)

首先,将病毒类型分为2个不同的列

dtsx

接下来,使用dat <- read_table("apksha time type market 8AB46C4A8AC 2013-09-23 16:04:24 adware++virus 1mobile") dat <- dat %>% separate(type, into = c("type1", "type2"), sep = "\\+\\+") # A tibble: 1 × 5 apksha time type1 type2 market * <chr> <dttm> <chr> <chr> <chr> 1 8AB46C4A8AC 2013-09-23 16:04:24 adware virus 1mobile 重建数据,不会触及id.vars中的列

reshape2::melt

希望有帮助,如果还有其他问题请告诉我!

答案 1 :(得分:0)

我们可以使用data.table来执行:

library(data.table)

data1 <- data.table(apksha = c("8AB46C4A8AC"), time = c("2013-09-23 16:04:24"), type = c("adware++virus"), market = c("1mobile"))

data1[, paste0("type", 1:2) := tstrsplit(type, "\\+\\+")]
melt(data1[,.(apksha, time, market,type1,type2)], id.vars = c("apksha", "time", "market"))

 data1 >

     apksha                time  market variable  value
1: 8AB46C4A8AC 2013-09-23 16:04:24 1mobile    type1 adware
2: 8AB46C4A8AC 2013-09-23 16:04:24 1mobile    type2  virus

您只需重命名列名称即可!