我有观察恶意软件的数据框。其中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)
答案 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
您只需重命名列名称即可!