当向量中的至少一个对象与其他向量中的至少一个对象匹配时对组和索引列进行排序

只是

我试图找到一种对行进行分组并为每个组分配索引而不使用循环的方法。困难在于分组变量num没有唯一标识符。num是数字(定义为字符)的向量。我想将至少与向量中的任何数字匹配的所有行分组。向量长度不同,最多可包含20个数字。让我举个例子吧:

我有一个这样的数据框:

df <- data.frame(id = c(1:5), num = c('111;222', '333;111;444', '000;88888;1', '9999;111', '1'))

用分隔符分割num ; 这样每一行都变成一个向量:

library(dplyr)
df <- df %>%
  mutate(num = str_split(num, ';'))

我想索引向量中至少一个数字与相同索引匹配的所有行。结果应如下所示:

id     num               group_index
1  c('111','222')             1
2  c('333','111','444')       1
3  c('000','88888','1')       2
4  c('9999','444')            1
5  '1'                        2

该示例说明了另一个困难:组1由'111'和'444'标识,即使行1是组1的一部分并且在num中不包含'444'

如果num只是一个字符串,我将执行以下操作

df <- group_by(num) %>%
  mutate(group_index = group_indices(.,num))

现在,我认为也许应该从确定群体开始。第一种无效的方法是:

df <- df %>%
 group_by_if(num, any(num, str_c(num, collapse = '|')) == T)

我知道我可以通过编写循环开始。但是,R在使用循环时效率不是很高,因此我更希望没有循环的解决方案-如果有的话?任何提示都会有所帮助!

三角旗

好的,这个答案可能可以缩短(可能很多),但是我认为使用igraphapache可以使每一个都清晰可见,以便直观地检查组的数量。

library( data.table )
library( igraph )
#make df a data.table
setDT(df)
#split num-column to v1, v2, ... ,vn
df[, paste0("v", 1:length( tstrsplit(df$num, ";"))) := tstrsplit( num, ";")]
#    id         num   v1    v2   v3
# 1:  1     111;222  111   222 <NA>
# 2:  2 333;111;444  333   111  444
# 3:  3 000;88888;1  000 88888    1
# 4:  4    9999;111 9999   111 <NA>
# 5:  5           1    1  <NA> <NA>

#now melt to long format
df.melt <- melt(df, id.vars = "id", measure.vars = patterns("^v[0-9]"), value.name = "from" )
#create links
df.melt[, to := shift( from, type = "lead"), by = .(id)][]
#drop inomplete rows
df.melt <- df.melt[ complete.cases(df.melt), ]
#    id variable  from    to
# 1:  1       v1   111   222
# 2:  2       v1   333   111
# 3:  3       v1   000 88888
# 4:  4       v1  9999   111
# 5:  2       v2   111   444
# 6:  3       v2 88888     1

g = graph_from_data_frame( df.melt[ , .(from, to)])
# plot(g)

在此处输入图片说明

看起来我们有两个单独的小组可以合作。让我们找出哪个节点(编号)属于哪个组,并在原始df上使用此信息

dt.lookup <- as.data.table( components(g)$membership, keep.rownames = TRUE )
#       V1 V2
# 1:   111  1
# 2:   333  1
# 3:   000  2
# 4:  9999  1
# 5: 88888  2
# 6:   222  1
# 7:   444  1
# 8:     1  2


#go back to the molten data of the original df
df.melt <- melt(df, id.vars = "id", measure.vars = patterns("^v[0-9]"))
df.melt <- df.melt[ complete.cases(df.melt), ]
#perform update join to get the groupnumber
df.melt[ dt.lookup, group := i.V2, on = .(value = V1) ]
#    id variable value group
# 1:  1       v1   111     1
# 2:  2       v1   333     1
# 3:  3       v1   000     2
# 4:  4       v1  9999     1
# 5:  5       v1     1     2
# 6:  1       v2   222     1
# 7:  2       v2   111     1
# 8:  3       v2 88888     2
# 9:  4       v2   111     1
# 10: 2       v3   444     1
# 11: 3       v3     1     2

#summarise to go back to oroiginal df form
df.melt[, .(num = paste0( value, collapse = ";"),
            group = paste0( unique(group), collapse = ",")),
        by = .(id) ][]

最终输出

#    id         num group
# 1:  1     111;222     1
# 2:  2 333;111;444     1
# 3:  3 000;88888;1     2
# 4:  4    9999;111     1
# 5:  5           1     2

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取至少一个关联对象的记录

来自分类Dev

在MATLAB中的向量中添加围绕一个的其他值的其他值

来自分类Dev

检测对象的至少一个属性是否被修改

来自分类Dev

至少一个对象必须实现IComparable调用OrderBy()

来自分类Dev

基于将第二个向量与另一个对象中的行名匹配,在数据框中创建向量

来自分类Dev

检查哪些单词在另一个向量的单词中至少出现一次

来自分类Dev

检查一个向量是否包含另一向量中的至少一个值

来自分类Dev

SQL当属性至少匹配值列表时选择一个组

来自分类Dev

在Form Assembly的组中至少需要一个字段进行Salesforce集成

来自分类Dev

查找组中至少一个元素是否匹配至少一个模式

来自分类Dev

如何对向量进行重新排序,使其与R中另一个向量的顺序匹配?

来自分类Dev

y_true中至少指定了一个标签,目标向量为数值

来自分类Dev

Python:删除列表中至少由同一列表中其他一个字符串包含的字符串

来自分类Dev

从data.table中的每个组中减去一个向量,并按两者中的日期进行匹配

来自分类Dev

如何检查另一个对象内的至少一个对象

来自分类Dev

当向量中的至少一个对象与其他向量中的至少一个对象匹配时对组和索引列进行排序

来自分类Dev

如何获取包含至少一个元素出现的列表中的向量数量?

来自分类Dev

通用列表排序。至少一个对象必须实现IComparable

来自分类Dev

将一个对象与其他几个相关

来自分类Dev

在MATLAB中的向量中添加围绕一个值的其他值的其他值

来自分类Dev

SQL当属性至少匹配值列表时选择一个组

来自分类Dev

仅在选择特定的一组单选按钮中的至少一个时显示图像

来自分类Dev

查找具有至少一个匹配属性的集合中的所有对象

来自分类Dev

如何检查if语句中是否设置了List <T>中的至少一个对象特定属性

来自分类Dev

至少一个对象必须在 Min() 中实现 IComparable

来自分类Dev

需要至少一个 MultiFieldPanel 对象 [wagtail]

来自分类Dev

LINQ 查询结果中的“至少一个对象必须实现 IComparable”异常

来自分类Dev

根据组中其他列中至少一个变量的出现创建新列

来自分类Dev

在 R 中按组比较一个变量与其他变量

Related 相关文章

  1. 1

    获取至少一个关联对象的记录

  2. 2

    在MATLAB中的向量中添加围绕一个的其他值的其他值

  3. 3

    检测对象的至少一个属性是否被修改

  4. 4

    至少一个对象必须实现IComparable调用OrderBy()

  5. 5

    基于将第二个向量与另一个对象中的行名匹配,在数据框中创建向量

  6. 6

    检查哪些单词在另一个向量的单词中至少出现一次

  7. 7

    检查一个向量是否包含另一向量中的至少一个值

  8. 8

    SQL当属性至少匹配值列表时选择一个组

  9. 9

    在Form Assembly的组中至少需要一个字段进行Salesforce集成

  10. 10

    查找组中至少一个元素是否匹配至少一个模式

  11. 11

    如何对向量进行重新排序,使其与R中另一个向量的顺序匹配?

  12. 12

    y_true中至少指定了一个标签,目标向量为数值

  13. 13

    Python:删除列表中至少由同一列表中其他一个字符串包含的字符串

  14. 14

    从data.table中的每个组中减去一个向量,并按两者中的日期进行匹配

  15. 15

    如何检查另一个对象内的至少一个对象

  16. 16

    当向量中的至少一个对象与其他向量中的至少一个对象匹配时对组和索引列进行排序

  17. 17

    如何获取包含至少一个元素出现的列表中的向量数量?

  18. 18

    通用列表排序。至少一个对象必须实现IComparable

  19. 19

    将一个对象与其他几个相关

  20. 20

    在MATLAB中的向量中添加围绕一个值的其他值的其他值

  21. 21

    SQL当属性至少匹配值列表时选择一个组

  22. 22

    仅在选择特定的一组单选按钮中的至少一个时显示图像

  23. 23

    查找具有至少一个匹配属性的集合中的所有对象

  24. 24

    如何检查if语句中是否设置了List <T>中的至少一个对象特定属性

  25. 25

    至少一个对象必须在 Min() 中实现 IComparable

  26. 26

    需要至少一个 MultiFieldPanel 对象 [wagtail]

  27. 27

    LINQ 查询结果中的“至少一个对象必须实现 IComparable”异常

  28. 28

    根据组中其他列中至少一个变量的出现创建新列

  29. 29

    在 R 中按组比较一个变量与其他变量

热门标签

归档