【问题标题】:Creating a vector with numbers "partnered" with other numbers in another vector创建一个数字与另一个向量中的其他数字“配对”的向量
【发布时间】:2016-07-26 21:22:48
【问题描述】:

我有 5 个向量,其中 2 个我认为是“成对的”,这意味着它们具有相同数量的元素,并且每个向量中的相应元素相互匹配(在我的例子中,我为不同的 Beta 指定了 alpha 和 beta分布)。我想制作一个包含三个不成对向量的元素和其他两个向量中的元素对的所有组合的矩阵。我想这样做的方法是将对中的一个向量的元素与其他三个非配对向量进行组合,然后将左侧配对向量的元素与其伙伴匹配。我已经进行了组合,但正在努力完成第二部分 - 在组合完成后将元素配对。这是我第一部分的代码:

l <- list(alpha=c(8.572, 20, 23.333, 45), n=c(10, 20, 40), numc=c(2, 3, 5), numq=c(5, 10, 20))  
combo <- expand.grid(l)
beta <- c(20, 20, 10, 5)

“combo”对象的前几行如下所示:

    alpha  n numc numq
1  8.572 10    2    5
2 20.000 10    2    5
3 23.333 10    2    5
4 45.000 10    2    5
5  8.572 20    2    5
6 20.000 20    2    5

现在我想在这个数据框中插入一个名为“beta”的向量,它将每个 alpha 值(索引 1 到 4)与我指定的 beta 向量中的相应 beta 值配对。例如,每当 alpha 为 8.572,beta 为 20。我该怎么做?

【问题讨论】:

  • 这不就是combo$beta &lt;- beta吗?虽然如果数据尚未排序(如您的情况),您也可以执行 combo$beta &lt;- beta[match(combo$alpha, l$alpha)] 可能
  • 哦,是的。谢谢。看起来这只有效,因为 alpha 值一次循环通过一个,但如果我在列表中有第二个或第三个或第四个 alpha 然后通过 expand.grid 运行它,这将不起作用。不过没关系。
  • 然后match 将起作用。或factor 就像在下面的答案中

标签: r vector


【解决方案1】:

我想你想要的是

alpha <- factor(combo$alpha)
beta <- factor(beta)
combo$beta <- beta[alpha]

如果您只能使用因子的水平,不确定为什么需要匹配?例如,假设您随机排列 alpha。

sa <- sample(alpha)
combo$beta <- beta[sa]

这应该仍然是正确的。

在您发表评论后,@David Arenburg:

l <- list(alpha=c(23.333, 20, 45, 8.572), 
     n=c(10, 20, 40), numc=c(2, 3, 5), numq=c(5, 10, 20)) 
combo <- expand.grid(l)
beta <- factor(c(20, 20, 10, 5))
alpha <- factor(combo$alpha)
combo$beta <- beta[alpha]

这不正是 OP 想要的吗?

 head(combo)
   alpha  n numc numq beta
1 23.333 10    2    5   10
2 20.000 10    2    5   20
3 45.000 10    2    5    5
4  8.572 10    2    5   20
5 23.333 20    2    5   10
6 20.000 20    2    5   20

如果要将一个数值向量中的第 n 个元素映射到某个因子,您可能会考虑将数值向量视为有序因子。这样,您可以指定排序,并且它不会取决于您对 beta 的初始排序。

在这里,我切换了 beta 的顺序,并将级别提供为有序因子 alpha,这是根据您的原始顺序指定的。

l <- list(alpha=c(23.333, 20, 45, 8.572), 
     n=c(10, 20, 40), numc=c(2, 3, 5), numq=c(5, 10, 20)) 
combo <- expand.grid(l)
beta <- factor(c(20, 10, 20, 5))
alpha <- as.ordered(factor(combo$alpha, 
                           levels = c(8.572, 20, 23.333, 45)))
combo$beta <- beta[alpha] 

您会注意到,正如您最初想要的那样,alpha 级别的第 n 个元素被映射到 beta 的第 n 个元素。

如果没有,我建议你使用match

【讨论】:

  • 因为依靠factor 自己设置关卡是危险的。如果alpha 不在加入顺序中,那么您的解决方案将不起作用。考虑以下示例alpha &lt;- factor(c(2, 1, 4, 3)) ; beta &lt;- c(20, 10, 10, 5) ; beta[alpha]
  • 哦,也许是因为你没有考虑到这两个因素?
  • 在您的示例中,alpha23.333 开头,beta20 开头,而head(combo) 的第一行在alpha == 23.333 时显示beta == 10,所以不'似乎无法正常工作
  • 但是 OP 希望 23.333 的 alpha 值映射到 10 的 beta 值?
  • 是的,我希望 23.333 的 alpha 值映射到 10 的 beta 值,因为在我的原始示例中,这些都是各自向量的第三个元素。
猜你喜欢
  • 2016-08-18
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多