根据R中的变量更有效地重构数据帧行
我有观察恶意软件的数据框架。它的一个变量是type。因为type变量包含类型的组合(例如:adware++特洛伊木马)。出于某种原因,我需要根据类型复制这些观察结果,同时使用每个分解的类型给出每个重复的观察结果。例如,对于1个观察:根据R中的变量更有效地重构数据帧行,r,dataframe,R,Dataframe,我有观察恶意软件的数据框架。它的一个变量是type。因为type变量包含类型的组合(例如:adware++特洛伊木马)。出于某种原因,我需要根据类型复制这些观察结果,同时使用每个分解的类型给出每个重复的观察结果。例如,对于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++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)
newData首先,将病毒类型分为两列
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
希望这对我有所帮助,如果还有其他问题,请告诉我 我们可以使用data.table执行以下操作:
库(数据表)
data1
apksha时间市场变量值
1:8AB46C4A8AC 2013-09-23 16:04:24移动类型1广告软件
2:8AB46C4A8AC 2013-09-23 16:04:24移动类型2病毒
你所要做的就是重新命名列名,这样就可以了 您介意在前10行左右的数据中添加一个dput()
?谢谢@Jaap,您提到的问题与此类似。但由于我的数据有两个以上的变量(列),所以不能用同样的方法解决。我用一个更常见的解决方案更新了我的帖子。借用了那个问题的想法。你们读过吗<代码>tidyr::单独的行(rawData,type,sep='\\+\\+')
工作得很好
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
melt(dat, id.vars=c("apksha", "time", "market"))
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
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