R的家属和先例

时间:2017-10-18 18:10:41

标签: r

在R中标记Dependents和Precedents的数量需要帮助。我的数据框包含一些公式(字符串),我想添加" col3"其中应包含:0表示A1,1表示A2(因为A2依赖于A1 - 一个依赖关系),2表示A3(因为A3取决于A2 / A1)。

col1 <- c('A1','A2','A3', 'A6','A4','A7')
col2 <- c('X1+Y1','A1+Y2', 'A4+Y3+A2', 'Y5+A1','A2+A1+A3','A2+A1')
df <- data.frame(col1, col2, stringsAsFactors=F)

我的输出应该如下:

 col1  col2 col3
1   A1 Y1 0
2   A2 A1+Y2 1 
3   A3 A4+Y3+A2 5
4   A6 Y5+A1 1
5   A4 A2+A1+Y3 3
6   A7 A2+A1 3

我有一个包含100多行此格式的数据框。感谢你能否提供帮助。

2 个答案:

答案 0 :(得分:0)

下面的代码会产生正确的输出。

    col0 <- c('A1','A2','A3', 'A6','A4','A7')
    col2 <- c('X1+Y1','A1+Y2', 'A1+Y3+A2', 'Y5+A2','A2+A1+A3','A2+A3')
    df <- data.frame(col0, col2, stringsAsFactors=F)

library(tidyr)
library(dplyr)
df1 <- df %>% 
  separate(col2, into = as.character(c(1:4)),sep = "\\+") %>% 
  replace(is.na(.),"") 

df1$OOE <- 0
for (i in 1:nrow(df1)) {
  for (j in 2:ncol(df1)) {
    for (k in 1:nrow(df1)) {
        if (df1[i,j] == df1$col0[k]) df1$OOE[i]=df1$OOE[k]+df1$OOE[i]+1
    }
  }
}


  col0  1  2  3 4 OOE
1   A1 X1 Y1        0
2   A2 A1 Y2        1
3   A3 A1 Y3 A2     3
4   A6 Y5 A2        2
5   A4 A2 A1 A3     7
6   A7 A2 A3        6

答案 1 :(得分:0)

如果AX可以依赖于YY,其中Y> X,我们需要树状结构来查找依赖关系。我知道igraph包,但似乎复杂的任务。我们只需要一些参考语义,经过一些研究,data.tree包似乎是合适的。这是代码:

col1 <- c('A1','A2','A3', 'A6','A4','A7')
col2 <- c('X1+Y1','A1+Y2', 'A1+Y3+A2', 'Y5+A2','A2+A1+A3','A2+A3')

df <- data.frame(col1, col2, stringsAsFactors=F)

require(data.tree)

# Create the graph/forest based on the data
getForest <- function(data) {

  res <- new.env()

  for( i  in 1:nrow(data)){

    nname <- data$col1[i]

    if(!exists(nname,where=res))
      assign(nname,Node$new(nname), pos=res)

    par <- get(nname, envir=res)
    print(par)

    #Add the childs
    deps <- unlist(regmatches(data$col2[i],gregexpr("A\\d+",data$col2[i])))

    for( ch in deps) {
      print("Ammm")

      if(!exists(ch, where=res))
        assign(ch,Node$new(ch), pos=res)

      child <- get(ch, envir=res)
      par$AddChildNode(child)

    }

  }

  #Return the nodes 
  res 

}

f <- getForest(df)

# Function to get the dependency level
getLevel<- function(node) {
  if (node$count == 0)
    return (0)
  else {
    return (length(node$children)+sum(sapply(node$children,getlevel)))
  }
}

#Add dependency level to data frame
df$col3 <- sapply(df$col1, function(x) {getLevel(get(x,f))})

df
#  col1     col2 col3
#1   A1    X1+Y1    0
#2   A2    A1+Y2    1
#3   A3 A1+Y3+A2    3
#4   A6    Y5+A2    2
#5   A4 A2+A1+A3    7
#6   A7    A2+A3    6