我有一个保存关联规则的文本文件,因此我使用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)))
答案 0 :(得分:2)
我们可以使用cSplit
包中的splitstackshape
和gsub
分割第一列,
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