Как я могу улучшить свой код для преобразования столбца фактора в список в рамках data.frame? - PullRequest
1 голос
/ 10 июля 2019

Я хочу преобразовать столбец фактора в списки внутри data.frame.
Я сделал это с помощью приведенного ниже кода, но я чувствую, что это не правильный путь.
Как я могу улучшитькод ниже?

Данные, с которыми я имею дело, являются результатом правил ассоциации. (Использование пакета: arules) (на японском языке)
Вот 3 строки столбца "rules":

правила
{道路 構造 = 交 差点 _ 交 差点 付 近, 昼間 12 時間 平均 速度 = 20 ~ 30 км / ч, 率 道 設置 率 = 100%, バ ス 優先. 専 用 レ ー ン の 有無 な = 有無 有無 な} => {事故 類型 = 車 両 相互 _ 追 突}
{道路 構造 = 交 差点 _ 交 差点 付 近, 昼間 12 時間 平均 旅行 速度 = 20 ~ 30 км / ч, バ ス 優先. 専 用 レ ー ン の 有無 = な し} => {類型 類型 = 車 両 相互 _ 追 突}
{道路 構造 = 交 差点 _ 交 差点 付 近, 歩 道 設置 率 = 100%, バ ス 優先.} => {事故 類型 = 車 両 相互 _ 追 突}

И ул (дата)

'data.frame': 50 шт.из 5 переменных:
$ правила: фактор с 50 уровнями "{道路 構造 = 交 差点 _ 交 差点 付 近, バ ス 優先. 専 用 レ ー ン の 有無 = な し, 指定 最高 速度 = 50} => {事故 類型 = 車 両 相互 _"突}", ..: 9 8 35 38 10 31 11 25 3 7 ...
$ поддержка: коэффициент с 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 голосов
/ 10 июля 2019

Мы можем использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...