将模糊逻辑应用于R中的Data.Frame(包:集)*更新*

时间:2017-02-21 01:27:24

标签: r dataframe logic fuzzy

我正在使用R中的sets包创建一个模糊逻辑系统,为三种类型的遗传数据分配成员资格。我已成功创建模糊Universe,变量,规则,模型,并成功使用fuzzy_inferencegset_defuzzify为单个观察指定成员资格。我想找到一种方法将此过程应用于包含1.7k观测值的数据框:

head(df)
  cell.line  Gene mutation Expression Copy.Number
1     SCC-4 ABCB1        0          0           1
2    CAL-27 ABCC3       -2          1           0    
3    CAL-27  ABL1       -4          0           0    
4    SCC-15   ACE        0         -1           0    
5    CAL-27  ACE2        0          1           0
6    SCC-15 ACER1        0         -1           0

我想运行以下代码并应用于我的整个数据框,并将每个观察的gset_expression结果导出到新列中。

example.1 <- fuzzy_inference(model, list(mut = df$mutation, exp = df$Expression, CN = df$Copy.Number))
df$fuzzy <- gset_defuzzify(example.1, "centroid")

如果我手动输入每列的内容,代码就有效,但是我想在整个数据集上应用此功能(全套包含&gt; 1,000行)。

example <- fuzzy_inference(model, list(mut = 0, exp = 0, CN = 1))
gset_defuzzify(example, "centroid")
>[1] 0.8392016
example.2 <- fuzzy_inference(model, list(mut = -2, exp = 1, CN = 0))
gset_defuzzify(example.2, "centroid")
>[1] 1.160809

我认为我需要一个应用功能,但是我比R更新并且发现自己陷入困境。我尝试了以下几次迭代:

Fuzzy <- do.call(rbind, apply(df, 1, function(x) + 
fuzzy_inference(model, 
list(mut = df$mutation, exp = df$Expression, CN = df$Copy.Number) + ))) 
Error in df$mutation : $ operator is invalid for atomic vectors

我也试过使用申请无效:

apply(df, 1, function(row){
    m <- row['mutation']
    e <- row['Expression']
    c <- row['Copy.Number']
    fuzzify <- fuzzy_inference(model, list(mut = m, exp = e, CN = c))
   gset_defuzzify(fuzzify, "centroid")
})

>  1   2   3   4   5   6 
>NaN NaN NaN NaN NaN NaN

apply(df, 1,                                        

     function(x) {

       example.3 <- fuzzy_inference(model, 
                    list(mut = x['mutation'], exp = x['Expression'], 
                    CN = x['Copy.Number']))

       gset_defuzzify(example.2, "centroid")

   })

>   1.160809 1.160809 1.160809 1.160809 1.160809 1.160809

这可能吗?谢谢你的帮助!

----------------------------------------------- ---------------------------------

我找到了一个解决方案,但它不是很优雅。如果有人对如何以一种不太复杂的方式解决问题有任何想法,我将不胜感激。感谢。

df$rownm <- rownames(df)
fuzz.1 <- function(y){
    fuzzify <- fuzzy_inference(model, list(mut = df[y,'mutation'], exp = df[y,'Expression'], CN = df[y,'Copy.Number']))
   gset_defuzzify(fuzzify, "centroid")}
df$membership <- sapply(df$rownm, fuzz.1) 

head(df[1:2,])
      cell.line  Gene mutation Expression Copy.Number rownm membership
    1     SCC-4 ABCB1        0          0           1     1          0.8392016
    2    CAL-27 ABCC3       -2          1           0     2          1.160809

0 个答案:

没有答案