如何改善代码以将一列因子转换为data.frame中的列表?

时间:2019-07-10 01:23:11

标签: r

我想将一列因子转换为data.frame中的列表。
我是用下面的代码实现的,但是我觉得这不是正确的方法。
如何改善下面的代码?

我正在处理的数据是关联规则的结果。(使用程序包:rules)(日语)
这是“规则”列的3行:

  

规则
  {道路构造=交差点_交差点付近,昼间12时间平均旅行速度= 20〜30km / h,歩道设置率= 100%,バス优先。専用レーンの有无=なし} => {事故类型=车両相互_追突}
  {道路构造=交差点_交差点付近,昼间12时间平均旅行速度= 20〜30km / h,バス优先。専用レーンの有无=なし} => {事故类型=车両相互_追突}
  {道路构造=交差点_交差点付近,歩道设置率= 100%,バス优先。専用レーンの有无=なし,代表沿道状况=人口集中地区(商业地域を除く)} => {事故类型=车両相互_追突}

和str(data)

  

“ data.frame”:50磅。 5个变量中:
   $ rules:具有50个级别的因子“ {道路构造=交差点_交差点付近,バス优先。専用レーンの有无=なし,指定最高速度= 50} => {事故类型=车両相互_追突}“,。: 9 8 35 38 10 31 11 25 3 7 ...
   $ support:带有48个水平的系数“ 0.050295052”,..:5 14 5 10 24 1 30 13 15 18 ...
   $信心:具有50个水平的因数“ 0.555131629”,..:50 49 48 47 46 45 44 43 42 41 ...
   $提升:具有50个级别的系数“ 1.894879112”,..:50 49 48 47 46 45 44 43 42 41 ...
   $ count:具有48个级别的因子“ 1013”,“ 1250”,..:9 18 9 14 28 5 34 17 19 22 ...

# convert factor to character
data %>% mutate_if(is.factor, as.character) -> data

# delete the RHS in rules(the part after '=>' )
data$rules <- strsplit(data$rules, " =>")
i = 1
for (i in 1:length(data$rules)) {
  data$rules[[i]] <- data$rules[[i]][[-2]]
}

# delete "{" and "}"
data$rules <- as.character(data$rules)
data$rules <- strsplit(data$rules, "[{]")
i = 1
for (i in 1:length(data$rules)) {
  data$rules[[i]] <- data$rules[[i]][[-1]]
}

data$rules <- as.character(data$rules)
data$rules <- strsplit(data$rules, "[}]")

# split character to list (:length(data$rules[[1]] -> 4))
data$rules <- as.character(data$rules)
data$rules <- strsplit(data$rules, ",")

输出应如下所示:

[[1]]
[1] "道路構造=交差点_交差点付近"        "昼間12時間平均旅行速度=20~30km/h" "歩道設置率=100%"                   "バス優先.専用レーンの有無=なし"   

[[2]]
[1] "道路構造=交差点_交差点付近"        "昼間12時間平均旅行速度=20~30km/h" "バス優先.専用レーンの有無=なし"   

[[3]]
[1] "道路構造=交差点_交差点付近"                  "歩道設置率=100%"                             "バス優先.専用レーンの有無=なし"             
[4] "代表沿道状況=人口集中地区(商業地域を除く)"

我的代码确实起作用了,但是,我只是觉得它并不美观或效率很高。
所以你可以改善它。或者,正确的方法来完成这项工作。

1 个答案:

答案 0 :(得分:0)

我们可以使用str_extract

library(stringr)
library(dplyr)
out <- data %>% 
         mutate(rules = trimws(str_extract(rules, "(?<=\\{)[^}]+")))
out$rules
#[1] "道路構造=交差点_交差点付近,昼間12時間平均旅行速度=20~30km/h,歩道設置率=100%,バス優先.専用レーンの有無=なし"          
#[2] "道路構造=交差点_交差点付近,昼間12時間平均旅行速度=20~30km/h,バス優先.専用レーンの有無=なし"                          
#[3] "道路構造=交差点_交差点付近,歩道設置率=100%,バス優先.専用レーンの有無=なし,代表沿道状況=人口集中地区(商業地域を除く)"

如果我们要按,划分“规则”并创建一个list

out$rules <- str_split(out$rules, ",")

数据

data <- structure(list(rules = c("{道路構造=交差点_交差点付近,昼間12時間平均旅行速度=20~30km/h,歩道設置率=100%,バス優先.専用レーンの有無=なし} => {事故類型=車両相互_追突}", 
"{道路構造=交差点_交差点付近,昼間12時間平均旅行速度=20~30km/h,バス優先.専用レーンの有無=なし} => {事故類型=車両相互_追突}", 
"{道路構造=交差点_交差点付近,歩道設置率=100%,バス優先.専用レーンの有無=なし,代表沿道状況=人口集中地区(商業地域を除く)} => {事故類型=車両相互_追突}"
)), class = "data.frame", row.names = c(NA, -3L))