Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据R中的变量更有效地重构数据帧行_R_Dataframe - Fatal编程技术网

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

根据R中的变量更有效地重构数据帧行,r,dataframe,R,Dataframe,我有观察恶意软件的数据框架。它的一个变量是type。因为type变量包含类型的组合(例如:adware++特洛伊木马)。出于某种原因,我需要根据类型复制这些观察结果,同时使用每个分解的类型给出每个重复的观察结果。例如,对于1个观察: apksha time type market 8AB46C4A8AC 2013-09-23 16:04:24 adware++virus 1mobile 我希望它像:

我有观察恶意软件的数据框架。它的一个变量是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   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