首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使循环函数作为R中的数据帧输出其结果

如何使循环函数作为R中的数据帧输出其结果
EN

Stack Overflow用户
提问于 2022-02-18 14:44:11
回答 1查看 54关注 0票数 2

我创建了一个函数clique_function,它根据条件从两个数据帧object_listclique_list中选择变量,并从该clique_object返回一个新的数据框架。

输入:

clique_list是一组团(网络中的三个节点组成的组),其中每个列代表一个由三个节点组成的团。

代码语言:javascript
复制
clique_list <- structure(c("ND1", "IS1", "IS3", "IS1", "IS3", "IS2", "ND2", 
"ND1", "IS1"), .Dim = c(3L, 3L))

object_list是一个矩阵,节点作为行,不同对象类型的出现作为列。

代码语言:javascript
复制
object_list <- structure(list(CA1 = c(0.159159159159159, 0.222222222222222, 
0.25, 0.115384615384615, 0.311111111111111, 0.1285140562249, 
0.214132762312634, 0.413461538461538, 0.183333333333333, 0.4, 
0.4375, 0.167778836987607, 0.25, 0.5, 0.166666666666667, 0.181818181818182, 
0.21580547112462, 0.0792452830188679, 0.424657534246575, 0, 0
), CA11 = c(0.00600600600600601, 0, 0, 0, 0, 0.00401606425702811, 
0.012847965738758, 0, 0.05, 0, 0, 0, 0, 0, 0, 0, 0.00911854103343465, 
0.0113207547169811, 0.0410958904109589, 0, 0), CA111 = c(0, 0, 
0, 0, 0, 0, 0.00499643112062812, 0, 0.0333333333333333, 0, 0, 
0, 0, 0, 0, 0, 0.0060790273556231, 0.00754716981132075, 0.0273972602739726, 
0, 0), CA1111 = c(0, 0, 0, 0, 0, 0, 0.000713775874375446, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), CA1113 = c(0, 0, 0, 0, 
0, 0, 0.000713775874375446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0), CA1115 = c(0, 0, 0, 0, 0, 0, 0.000713775874375446, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), CA1116 = c(0, 0, 0, 
0, 0, 0, 0, 0, 0.0166666666666667, 0, 0, 0, 0, 0, 0, 0, 0.00303951367781155, 
0.00377358490566038, 0, 0, 0), CA1117 = c(0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0136986301369863, 0, 0), CA112 = c(0, 
0, 0, 0, 0, 0, 0.00285510349750178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0), CA1122 = c(0, 0, 0, 0, 0, 0, 0.00142755174875089, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = "data.frame", row.names = c("ND5", 
"ND6", "ND8/ND10", "ND3", "ND7", "ND2", "ND1", "ND4", "KB3/KB4/KB5", 
"KB1", "KB2", "IS1", "KB9", "KB7/KB8", "KB6", "IS4", "IS3", "IS2", 
"KB12/KB14", "KB13", "IS5"))

函数clique_function应该围绕object_list循环,并从clique_list中选择三个节点的变量type (列)(如CA1 )。

代码语言:javascript
复制
 clique_function <- function(clique_list, type, object_list) 
  {
    for (i in 1:ncol(clique_list)) {
      clique_object <- subset(object_list, row.names(object_list) %in% clique_list[, i],
                              colnames(object_list) == type)
    }
    return(clique_object)
      }

预期输出clique_objectobject_list的子集,它显示了为clique_list中的所有集群选择的对象类型type的出现。

例如:

代码语言:javascript
复制
clique_object <- structure(list(cliques = c("ND1", "IS1", "IS3", "ND2", "IS1", 
"IS3", "ND1", "IS4", "IS3", "ND1", "IS1", "IS3", "ND1", "IS1", 
"IS8", "ND3", "IS1", "IS3", "ND1", "IS1", "IS3"), CA1 = c(0.0007137759, 
0.0047664442, 0.009118541, 0.0007137759, 0.0047664442, 0.009118541, 
0.0007137759, 0.0047664442, 0.009118541, 0.0007137759, 0.0047664442, 
0.009118541, 0.0007137759, 0.0047664442, 0.009118541, 0.0007137759, 
0.0047664442, 0.009118541, 0.0007137759, 0.0047664442, 0.009118541
)), class = "data.frame", row.names = c(NA, -21L))

如果我把return(clique_object)放在print(clique_object)上而不是print(clique_object),这个函数就能正常工作。在第一种情况下,我从在数据帧周围循环的函数中获得完整的列表。但是使用return(clique_object),我只能得到clique_list中第一个组的结果。

我希望该函数将整个结果作为数据框架输出。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-18 15:03:55

如果你改变了你的功能,像这样:

代码语言:javascript
复制
clique_function <- function(clique_list, type, object_list) 
{
  lapply(seq(1,ncol(clique_list)), function(i) {
    subset(object_list, row.names(object_list) %in% clique_list[, i],colnames(object_list) == type)
  })
}

然后它将返回如下所示的数据文件列表:

代码语言:javascript
复制
[[1]]
          CA1
ND1 0.2141328
IS1 0.1677788
IS3 0.2158055

[[2]]
           CA1
IS1 0.16777884
IS3 0.21580547
IS2 0.07924528

[[3]]
          CA1
ND2 0.1285141
ND1 0.2141328
IS1 0.1677788

然后,您可以选择如何组合这些帧。例如,您可以这样组合它们:

代码语言:javascript
复制
bind_rows(lapply(seq_along(res), function(x) tibble("clique"=x, "nodes"=rownames(res[[x]]), res[[x]])))
# A tibble: 9 x 3
  clique nodes    CA1
   <int> <chr>  <dbl>
1      1 ND1   0.214 
2      1 IS1   0.168 
3      1 IS3   0.216 
4      2 IS1   0.168 
5      2 IS3   0.216 
6      2 IS2   0.0792
7      3 ND2   0.129 
8      3 ND1   0.214 
9      3 IS1   0.168 

但我不知道你想要的输出结构是什么。在实际操作中,我将进一步调整clique_function以在一次调用中返回所需的最终结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71175340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档