【问题标题】:Binning different lengths in R在 R 中合并不同的长度
【发布时间】:2011-08-04 12:06:10
【问题描述】:

输入1

dput(a1  100 200 +
a1  250 270 +
a1  333 340 -
a2  450 460 +)

输入2

dput(a1  101 106 +
a1  112 117 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  260 262 +
a1  260 262 + 
a1  260 262 + 
a1  260 262 + 
a1  260 262 + 
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -)

输出

c   s   e   st  1   2   3   4   5   6   7   8   9   10
a1  100 200 +   1   2   0   0   0   0   0   0   0   0
a1  250 270 +   0   0   0   9   5   0   0   0   0   0
a1  330 340 -   0   0   0   0   0   0   0   6   7   0
a2  450 460 +   0   0   0   0   0   0   0   0   0   0

我想使用 input1 值计算点 (input2) 的密度。表示 a1-100-200 在这 100 到 200 范围内有多少个点?即3。我想对所有输入值做同样的事情。我想互相比较。但问题是值的长度(200-100=100 或 270-250=20)不同。为了将它们相互比较,我需要以我可以比较的方式缩放它们。所以我想出了 10 个 bins 窗口(输出)。我使用 input1 bin 计算 input2 点。 最后,我需要在 x 轴上绘制 bin,在 y 轴上绘制值 xyplot(x(bins),y1(a1:100:200:+)+y2(a1:250:270:+y3...+y4)

“+”表示我们需要以 100 为起点,200 为终点,当我们计算 bin 时(100-110 将是第一个 bin .....) - 意味着完全相反(190-200 将是第一个垃圾箱)

1-10 表示 1 到 10 个 bin

您需要根据 column1 键为 bin 使用第 1 列和第 2 列。我们删除不在范围内的值

c = character, s =start, e=end, s=strand, 1-10 是 input1 的 bin。是的,你是对的。例如,250-270 应该有 2 个数字差,因为(270-250=20,因此对于 10 个 bin,它将是 20/10=2)

【问题讨论】:

  • +- 的列是什么意思?它似乎与问题无关。此外,使用 dput 使您的数据可重现会很有帮助。
  • 我不清楚标记为 1-10 的列在您的输出中应该代表什么。就此而言,c,s,e,st 还代表什么?为什么最终会在标记为 1-10 的列中计数?
  • 还有两件事:为什么input2 有不止一列?你想如何处理input2 中不属于input1 中指定范围的值,例如,如何处理值 225?
  • 我们可以退后一步吗?您能否编辑您的问题以包含这 10 个 cmets 的相关详细信息?没有任何合理的问题需要有人通读 10 cmets 才能对问题所在有一个表面上的理解。我认为这里隐藏了一个很好的问题,但在当前的演示文稿中没有出现。帮助 SO 社区帮助您。这篇关于 SO 的帖子为提出好的问题提供了绝妙的见解:stackoverflow.com/questions/5963269/…
  • @repinemeter:嗯,不。在 R 中,键入 dput(input1)。输出应该是某种结构。在您的问题中,输入input1 <- <the output structure>。 (然后 CTRL+K 将其格式化为代码。)

标签: r binning


【解决方案1】:

这个问题仍然不是很好,所以我不确定我是否完全理解你想要什么,但你可能想使用tablecut 的组合。

您的样本数据

input1 <- data.frame(
  type  = paste("a", rep(1:2, times = c(3, 1)), sep = ""),
  lower = c(100, 250, 333, 450),
  upper = c(200, 270, 340, 460)
)

input2 <- data.frame(
  type = rep.int("a1", 28),
  lower = rep(c(101, 112, 258, 260, 332, 331), times = c(1, 1, 9, 5, 7, 5)),
  upper = rep(c(106, 117, 259, 262, 333), times = c(1, 1, 9, 5, 12))
)

首先,您根据input1 中的值定义箱。

cut_points <- with(input1, sort(c(start, end)))

然后按类型拆分input2$start,按箱切分,然后在每个箱中找到计数。

with(input2, tapply(start, type, function(x) table(cut(x, cut_points))))

可能重复end 列。

with(input2, tapply(end, type, function(x) table(cut(x, cut_points))))

【讨论】:

  • 描述问题的最简单方式可能是这样的。 input1 有 1 到 100 个随机数。输入 2 的范围为 10-20。我想计算在 10-20 范围内的随机数有多少。在我的问题中,输入具有不同长度的范围,例如 1-10、20-25 和 80-100。在这种情况下,计算落在这些不同范围内的随机数会很棘手。然后我想到将所有范围标准化为相似的比例。为此,我可以取所有范围的平均长度(好),或者我可以形成统一的箱并计算这些箱中的随机数(完美的方式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多