优雅的书写功能

时间:2019-04-02 11:02:45

标签: r function dictionary dplyr mutate

我有一个输入列(符号),它有10000多行,并且它们包含运算符和文本值,例如(“”,“>”,“ <”,“”,“ ****”,“ inv ”,“ MOD”,“可见”),如下面代码中的值所示。该列不包含任何数字。它仅包含代码中规定的值。

  

我想做的是将这些运算符('<','>'等)映射到不同的代码,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 :(得分:0)

根据我的理解,似乎您想创建一个充当键的数据框(请参见下面的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