当前位置: 首页 > 知识库问答 >
问题:

成对组合以及data.table计数

孔鸿哲
2023-03-14

我有一个data.framed如下。

d <- structure(list(sno = 1:7, list = c("SD1, SD44, SD384, SD32", 
"SD23, SD1, SD567", "SD42, SD345, SD183", "SD345, SD340, SD387", 
"SD455, SD86, SD39", "SD12, SD315, SD387", "SD32, SD1, SD40")), .Names = c("sno", 
"list"), row.names = c(NA, -7L), class = "data.frame")

d
  sno                   list
1   1 SD1, SD44, SD384, SD32
2   2       SD23, SD1, SD567
3   3     SD42, SD345, SD183
4   4    SD345, SD340, SD387
5   5      SD455, SD86, SD39
6   6     SD12, SD315, SD387
7   7        SD32, SD1, SD40

我想得到d$list中由“,”分隔的所有字符串的成对组合。

我可以使用lappy获得它,如下所示。

d2 <- strsplit(d$list, split = ", ")
d2 <- lapply(d2, function(x) as.data.frame(t(combn(x, m=2))))
library(data.table)
d2 <- rbindlist(d2)

我不想在d$list中包含每个组的计数以及组合列表d2作为新列。如何使用data.table

library(stringi)
stri_count_fixed(d$list,", ")

所需输出如下

out <- structure(list(V1 = structure(c(1L, 1L, 1L, 3L, 3L, 2L, 4L, 4L, 
1L, 6L, 6L, 5L, 5L, 5L, 7L, 8L, 8L, 9L, 10L, 10L, 11L, 12L, 12L, 
1L), .Label = c("SD1", "SD384", "SD44", "SD23", "SD345", "SD42", 
"SD340", "SD455", "SD86", "SD12", "SD315", "SD32"), class = "factor"), 
    V2 = structure(c(3L, 2L, 1L, 2L, 1L, 1L, 4L, 5L, 5L, 7L, 
    6L, 6L, 8L, 9L, 9L, 11L, 10L, 10L, 12L, 9L, 9L, 4L, 13L, 
    13L), .Label = c("SD32", "SD384", "SD44", "SD1", "SD567", 
    "SD183", "SD345", "SD340", "SD387", "SD39", "SD86", "SD315", 
    "SD40"), class = "factor"), count = c(4, 4, 4, 4, 4, 4, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), .Names = c("V1", 
"V2", "count"), row.names = c(NA, -24L), class = "data.frame")


out 
      V1    V2 count
1    SD1  SD44     4
2    SD1 SD384     4
3    SD1  SD32     4
4   SD44 SD384     4
5   SD44  SD32     4
6  SD384  SD32     4
7   SD23   SD1     3
8   SD23 SD567     3
9    SD1 SD567     3
10  SD42 SD345     3
11  SD42 SD183     3
12 SD345 SD183     3
13 SD345 SD340     3
14 SD345 SD387     3
15 SD340 SD387     3
16 SD455  SD86     3
17 SD455  SD39     3
18  SD86  SD39     3
19  SD12 SD315     3
20  SD12 SD387     3
21 SD315 SD387     3
22  SD32   SD1     3
23  SD32  SD40     3
24   SD1  SD40     3

共有1个答案

秦宁
2023-03-14

使用gsub可以删除除分隔符()之外的所有字符,使用nchar计算字符数,添加1以获得字数,并使用transform创建一个新列“count”。使用来自splitstackshape的cSplit,我们可以按方向将“列表”列拆分,通过将方向指定为长,我们重新格式化数据集。加载splitstackshape也将加载数据。表,因此我们可以使用数据。表聚合方法。按“sno”和“Count”((sno,Count))分组,我们得到“list”的combn,根据combn输出的交替值创建两列(“V1”,“V2”),并将“sno”列指定为NULL(如果不需要)

library(splitstackshape)
d1 <-  transform(d, Count=nchar(gsub('[^,]', '', list))+1L)
cSplit(d1, 'list', ', ', 'long')[, {
       tmp <- combn(as.character(list), 2)
       list(V1=tmp[c(TRUE, FALSE)], V2= tmp[c(FALSE, TRUE)])
         }, .(sno, Count)][, 
         sno:= NULL]
 #   Count    V1    V2
 #1:     4   SD1  SD44
 #2:     4   SD1 SD384
 #3:     4   SD1  SD32
 #4:     4  SD44 SD384
 #5:     4  SD44  SD32
 #6:     4 SD384  SD32
 #7:     3  SD23   SD1
 #8:     3  SD23 SD567
 #9:     3   SD1 SD567
#10:     3  SD42 SD345
#11:     3  SD42 SD183
#12:     3 SD345 SD183
#13:     3 SD345 SD340
#14:     3 SD345 SD387
#15:     3 SD340 SD387
#16:     3 SD455  SD86
#17:     3 SD455  SD39
#18:     3  SD86  SD39
#19:     3  SD12 SD315
#20:     3  SD12 SD387
#21:     3 SD315 SD387
#22:     3  SD32   SD1
#23:     3  SD32  SD40
#24:     3   SD1  SD40

或者修改您的代码,我们使用Map/cbind在“d2”中创建“Count”列,如本文所述,执行rbindlist以将列表折叠为单个数据。“表”对象。

library(stringi)
library(data.table)
Count <- stri_count_fixed(d$list,", ")+1
d2 <- strsplit(d$list, split = ", ")
d2 <- lapply(d2, function(x) as.data.frame(t(combn(x, m=2))))
rbindlist(Map(cbind, d2, Count=Count))
#      V1    V2 Count
# 1:   SD1  SD44     4
# 2:   SD1 SD384     4
# 3:   SD1  SD32     4
# 4:  SD44 SD384     4
# 5:  SD44  SD32     4
# 6: SD384  SD32     4
# 7:  SD23   SD1     3
# 8:  SD23 SD567     3
# 9:   SD1 SD567     3
#10:  SD42 SD345     3
#11:  SD42 SD183     3
#12: SD345 SD183     3
#13: SD345 SD340     3
#14: SD345 SD387     3
#15: SD340 SD387     3
#16: SD455  SD86     3
#17: SD455  SD39     3
#18:  SD86  SD39     3
#19:  SD12 SD315     3
#20:  SD12 SD387     3
#21: SD315 SD387     3
#22:  SD32   SD1     3
#23:  SD32  SD40     3
#24:   SD1  SD40     3

 类似资料:
  • 问题内容: 我需要的是对表的查询,该查询将返回列A和B的不同组合,以及表中每种组合发生多少次的计数。所有这些都将按A列进行排序。 如果表是: 结果将是: 任何帮助将是巨大的。 问题答案: GROUP BY是您的朋友在这里: SQLFiddle:http ://sqlfiddle.com/#!9/062b0e/5

  • 本文向大家介绍json对象与数组以及转换成js对象的简单实现方法,包括了json对象与数组以及转换成js对象的简单实现方法的使用技巧和注意事项,需要的朋友参考一下 JSON 语法规则 JSON 语法是 JavaScript 对象表示法语法的子集。 •数据在名称/值对中 •数据由逗号分隔 •花括号保存对象 •方括号保存数组 JSON 对象 JSON 对象在花括号中书写: 对象可以包含多个名称/值对:

  • 我需要从 5 个对象的集合中获取 7 个对象的所有可能组合。没有重复的组合(选择的顺序无关紧要,即以不同顺序选择的相同对象被视为相同的组合)。 我已经实现了,它工作正常并产生了正确的结果: 输出正确:找到了21个正确的组合。 但是它使用了一个按位运算符,在我看来,它的可读性、可维护性和可扩展性都不是很好。我想将它重构或完全重写为一种更加灵活和易于理解的面向对象的方法。我对如何使用OOP和递归实现这

  • 导语今天就给大家带来个语言识别跟语言转文字的小工具,1.直接使用在1.2官网注册后拿到APISecret和APIKey,直接复制文章2.4demo代码,保存为online_tts.py,在命令行执行python online_tts.py -client_secret=你的client_secret -client_id=你的client_id -file_save_path=test.wav --text=今天天气不错1. 获取权限Pyth

  • 问题内容: 时不时地,我遇到类似以下查询的情况: 在这种情况下,我想获得一个关联数组,使用&的值作为该数组的相应条目,例如,如果数据库包含:,则该数组应为。 最常见的方法是: *另一种方法是调用两次,然后使用创建数组。但是,由于涉及两个数据库两个调用,因此我将其省略。 还有另一种方法吗? 问题答案: 对于您的问题,有一个非常好的解决方案,即: 适用于我,在PostgreSQL 9.1和在Windo

  • PhoneGap介绍 PhoneGap是一个开源的移动开发框架。它允许您使用标准的Web技术,比如HTML5,CSS3和JavaScript的跨平台开发,避免每一个移动平台的原生开发语言。应用针对每个平台的封套内执行,并依靠符合标准的API绑定来访问每个设备的传感器,数据和网络状态。. PhoneGap开发适合的对象: 移动开发者,并希望扩展应用程序跨多个平台,每个平台的语言和工具集,而无需重新实