拆分关联规则将文本文件输出到列中

时间:2016-05-26 15:48:13

标签: r

我有一个保存关联规则的文本文件,因此我使用read.table读取文件,然后将其存储到矩阵中。文本文件数据如下

10 <- 8 3 (7,0.318182)
3 <- 8 10 (7,0.4375)
8 <- 3 10 (7,1)

我使用子集来破坏规则,现在我有三列这样的数据。

V1         V2        V3
10 <- 8 3   7    0.318182
3 <- 8 10   7    0.4375
8 <- 3 10   7    1

我尝试打破V1并仅将数字存储在新矩阵中但我有错误。当我检查foo [1,2]时,我得到一个结果

[1]  8 3
Levels: 8 3

这是我的代码。我需要一些帮助来打破所有这些值,然后将其存储在矩阵中。

rules = read.table("C:/Users/Alex/Desktop/rules 1.txt",header = FALSE, quote = "\"", sep = ",")
N<-nrow(rules)
trans= subset(rules, select=c("V1"))
foo <- data.frame(do.call('rbind', strsplit(as.character(a),'<-',fixed=TRUE)))

3 个答案:

答案 0 :(得分:2)

我们可以使用cSplit包中的splitstackshapegsub分割第一列,

library(splitstackshape)
df1 <- cSplit(data.frame(a = gsub('<-', '', df$V1)), 'a', ' ', 'wide')
df1
#   a_1 a_2 a_3
#1:  10   8   3
#2:   3   8  10
#3:   8   3  10

如果你想绑定它们,那么,

cbind(df1, df[,-1])
#   a_1 a_2 a_3 V2       V3
#1:  10   8   3  7 0.318182
#2:   3   8  10  7 0.437500
#3:   8   3  10  7 1.000000

数据

dput(df)
structure(list(V1 = c("10 <- 8 3", "3 <- 8 10", "8 <- 3 10"), 
    V2 = c(7L, 7L, 7L), V3 = c(0.318182, 0.4375, 1)), .Names = c("V1", 
"V2", "V3"), row.names = c(NA, -3L), class = "data.frame")

答案 1 :(得分:0)

我不确定我完全理解,但如果您将sep定义为空格,则可以在单独的列中获取前三个数字。

> rules = read.table(text = text, header = FALSE, quote = "\"", sep = " ")
> rules
  V1 V2 V3 V4           V5
1 10 <-  8  3 (7,0.318182)
2  3 <-  8 10   (7,0.4375)
3  8 <-  3 10        (7,1)

我建议separate tidyr进一步拆分剩余的列。

答案 2 :(得分:0)

以便我如何做到这一点。我们假设您将数据放在名为&#39; tmp.txt&#39;的文件中。您可以使用以下命令读取此文件的所有行:

data = readLines("tmp.txt")

这将创建一个数组,在第i个元素上包含文本文件的第i行。所以data[i]看起来像这样:

[1] "10 <- 8 3 (7,0.318182)"

您现在想要创建一个解析函数,该函数可以应用于此数组的所有元素,并返回一个矩阵,其中包含所有格式良好的数据。这应该做的工作:

parse_string = function(x){
  first_element = as.numeric(gsub(" .*", "", x))
  second_element = as.numeric(gsub(" .*", "", gsub(".* <- ", "", x)))
  third_element = as.numeric(gsub(" .*", "", gsub(".* <- [0-9]* ", "", x)))
  fourth_element = as.numeric(gsub(",.*", "", gsub(".*\\(", "", x)))
  fifth_element = as.numeric(gsub("\\).*", "", gsub(".*,", "", x)))
  matrix(c(first_element, second_element, third_element, fourth_element, fifth_element), nrow = 1)
}

例如,如果您运行parse_string(data[1]),则会获得:

 [,1] [,2] [,3] [,4]     [,5]
 [1,]   10    8    3    7 0.318182

最后,您可以在所有向量上运行parse_string,并将结果与​​:

绑定在一起
lapply(data, parse_string) %>% do.call(rbind)

这应该为您提供所需的矩阵作为输出:

 [,1] [,2] [,3] [,4]     [,5]
 [1,]   10    8    3    7 0.318182
 [2,]    3    8   10    7 0.437500
 [3,]    8    3   10    7 1.000000