Элегантный способ написать функцию - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть входной столбец (символы), который содержит более 10000 строк, и они содержат символы оператора и текстовые значения, такие как ("", ">", "<", "", "****", "inv"," MOD "," seen "), как показано ниже в коде в качестве значений.Этот столбец не содержит цифр.Он содержит только значение, указанное в коде.</p>

То, что я хотел бы сделать, это сопоставить эти символы операторов ('<', '>' и т. Д.) С различными кодами, 1) кодами операторов 2) кодами значений и иметь эти два разных кода в виде отдельных столбцов

У меня уже есть рабочий код, но он не очень эффективен, как вы видите, я повторяю одну и ту же операцию дважды.Один раз для Operator_codes, а затем для value_codes.Я уверен, что должен быть какой-то эффективный способ написать это.Я новичок в R и не очень знаком с другим подходом.

oper_val_concepts = function(DF){
operators_source = str_extract(.$symbols)
operators_source = as.data.frame(operators_source)
colnames(operators_source) <- c("Symbol")
operator_list = c("",">","<","-","****","inv","MOD","seen")
operator_codes = c(123L,14L,16L,13L,0L,0L,0L,0L)
value_codes=c(14L,12L,32L,123L,16L
,41L,116L,186L)
operator_code_map = map2(operator_list,operator_codes,function(x,y)c(x,y)) 
  %>% 
    data.frame()
value_code_map = map2(operator_list,value_codes,function(x,y) c(x,y)) %>% 
  data.frame()
operator_code_map = t(operator_code_map)
value_code_map = t(value_code_map)
colnames(operator_code_map) <- c("Symbol","Code")
colnames(value_code_map) <- c("Symbol","Code")
rownames(operator_code_map) = NULL
rownames(value_code_map) = NULL
dfm<-merge(x=operators_source,y=operator_code_map,by="Symbol",all.x = 
TRUE)
dfm1<-merge(x=operators_source,y=value_code_map,by="Symbol",all.x = TRUE)
 }

 t1 = oper_val_concepts(test)

Вывод команды dput равен

structure(list(Symbols = structure(c(2L, 3L, 1L, 4L, 2L, 3L, 
5L, 4L, 6L), .Label = c("****", "<", ">", "inv", "mod", "seen"
), class = "factor")), .Names = "Symbols", row.names = c(NA,-9L), class = 
"data.frame")

Я ожидаю, что вывод будет двумя столбцами в кадре данных, как показано ниже,

enter image description here

1 Ответ

0 голосов
/ 02 апреля 2019

Исходя из того, что я понимаю, кажется, что вы хотите создать фрейм данных, который будет действовать как ключ (см. key ниже). Получив это, вы можете просто присоединиться к фрейму данных, который просто содержит символы, с этим key фреймом данных.

df <- structure(list(Symbols = structure(c(2L, 3L, 1L, 4L, 2L, 3L, 
                                     5L, 4L, 6L), .Label = c("****", "<", ">", "inv", "mod", "seen"
                                     ), class = "factor")), .Names = "Symbols", row.names = c(NA, -9L), class = "data.frame")

key <- data.frame(Symbols = c("",">","<","-","****","inv","mod","seen"),
           Oerator_code_map = c(123L,14L,16L,13L,0L,0L,0L,0L),
           value_code_map = c(14L,12L,32L,123L,16L,41L,116L,186L))

df %>% left_join(key, by = "Symbols")

выход

  Symbols Oerator_code_map value_code_map
1       <               16             32
2       >               14             12
3    ****                0             16
4     inv                0             41
5       <               16             32
6       >               14             12
7     mod                0            116
8     inv                0             41
9    seen                0            186
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...