我有一个包含许多提示和内部 node 的系统发育树.我有一个树中的 node ID列表.这些是单独表格的一部分.我想在表中添加一个新列,children.为了获得子体( node 和提示),我使用phangorn::Descendants(tree, NODEID, type = 'all').我可以添加长度来获得子体的数量.例如

phangorn::Descendants(tree, 12514, type = 'all')
[1] 12515 12517 12516  5345  5346  5347  5343  5344

length(phangorn::Descendants(tree, 12514, type = 'all'))
[1] 8

我希望非常简单地在我的数据框" node "中获取列,并使用length(phangorn::Descendants(tree, 12514, type = 'all'))以上的函数在数据框中基于输入 node 创建一个新列.

以下是一个示例:

tests <- data.frame(nodes=c(12551, 12514, 12519))
length(phangorn::Descendants(tree, 12519, type = 'all'))
[1] 2
length(phangorn::Descendants(tree, 12514, type = 'all'))
[1] 8
length(phangorn::Descendants(tree, 12551, type = 'all'))
[1] 2
tests$children <- length(phangorn::Descendants(tree, tests$nodes, type = 'all'))
tests
  nodes children
1 12551        3
2 12514        3
3 12519        3

如上所示,子项的数量是数据的长度.框架,而不是上面计算的实际子级数.它应该是:

tests
  nodes children
1 12551        2
2 12514        8
3 12519        2

如果你有什么建议或 idea ,我可以让这一切按预期进行,那就太好了.我觉得我必须使用apply()或者在使用length()函数之前需要在内部建立索引.提前谢谢你.

推荐答案

你太接近了!这里有一个使用sapply的快速解决方案!有更多的 Select ,但这一个似乎遵循你的问题 struct !

生成一些数据

library(ape)

ntips <- 10
tree <- rtree(ntips)
targetNodes <- data.frame(nodes=seq(ntips+1, ntips+tree$Nnode))

请注意,我正在targetNodes对象中存储所有相关 node .这相当于您问题中的以下对象:

tests <- data.frame(nodes=c(12551, 12514, 12519))

使用sapply

现在,让我们使用sapplytargetNodes中的所有相关 node 上重复相同的操作:

targetNodes$children<- sapply(targetNodes$nodes, function(x){
  length(phangorn::Descendants(tree, x, type = 'all'))
})

我通过在targetNodes中创建一个新列来保存sapply函数的输出.

祝你好运

R相关问答推荐

单击 map 后,将坐标复制到剪贴板

R Markdown中的交叉引用表

更改编号列表的 colored颜色

如何从R中的字符串元素中减go 一个数字?

如何写一个R函数来旋转最后n分钟?

将嵌套列表子集化为嵌套列表

根据文本字符串中的值粘贴新列

如何从R ggplot图片中获取SVG字符串?

使用R中的正则表达式将一列分割为多列

SHINY:使用JS函数应用的CSS样式显示HTML表格

按多列统计频次

计算直线上点到参考点的总距离

在纵向数据集中创建新行

扩展R中包含列表的数据框

使用geom_sf跨越日期线时的闭合边界

按两个条件自动过滤数据

在子图内和子图之间对齐行数不均匀的表格罗布对

按顺序将地块添加到列表

向数据添加标签

以列名的字符向量作为参数按行应用自定义函数