我正在使用R中的sets包创建一个模糊逻辑系统,为三种类型的遗传数据分配成员资格。我已成功创建模糊Universe,变量,规则,模型,并成功使用fuzzy_inference
和gset_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