【问题标题】:For all elements in dataframe, count number of like and unlike elements by group factor对于数据框中的所有元素,按组因子计算相似和不同元素的数量
【发布时间】:2017-09-18 19:03:46
【问题描述】:

我正在尝试从 R 中的数据框中计算组内相似和不同邻居的数量,但我希望结果与原始数据框中的所有单个元素相关。我的起始数据框如下所示:

Group  ID
1      A
1      A
1      B
2      A
2      B
3      C

我想返回两个看起来像这样的向量:

Same  Different
1     1
1     1
0     2
0     1
0     1
0     0

我可以使用循环和一些简单的子集轻松地做到这一点,或者通过一起使用 tapply 和 table,然后将基于样本 ID 的结果与原始数据框合并。但是,我知道有一种更简单的方法可以做到这一点。我的印象是有一种方法可以使用应用函数来实现这一点,但我无法弄清楚如何做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • 你能解释一下你输出的逻辑吗?
  • 例如,对于第一行,商品 ID 为 A,在第 1 组中找到。在第 1 组(第 2 行)中还有一件商品 A,以及一件商品 B(第 3 行) )。因此,对于第一行,有一个相同的项目和一个不同的项目。

标签: r


【解决方案1】:

这是一种使用一些标准R 函数的方法。我们使用by 将数据“拆分”为Group,我们使用sapply 函数迭代ID 的各个值。其余代码将结果堆叠在一起。

cbind(dat, 
      do.call('rbind', 
              by(dat, dat$Group, function(d) 
                  t(sapply(d$ID, 
                           function(x) c('same' = sum(x == d$ID) - 1, 
                                         'different' = sum(x != d$ID)))))))

  Group ID same different
1     1  A    1         1
2     1  A    1         1
3     1  B    0         2
4     2  A    0         1
5     2  B    0         1
6     3  C    0         0

数据

dat <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 3L), ID = c("A", 
"A", "B", "A", "B", "C")), .Names = c("Group", "ID"), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

  • 非常感谢! by 函数是我所缺少的。欣赏它。
  • 很高兴它对您有所帮助。如果它解决了您的问题,您可以考虑接受并支持我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多