【问题标题】:Evaluate a function on .SDcols and return all columns in data.table评估 .SDcols 上的函数并返回 data.table 中的所有列
【发布时间】:2017-02-03 07:43:06
【问题描述】:

我有一个 data.table “结果”,它是 R 中 arules 包中 eclat() 的输出。

        lhs           rhs         sup        conf      lift       itemset
1: {XXXXXXXXXXX} {XXXXXXXXOOO} 0.001635323 1.0000000 611.50000       1
2: {XXXXXXXXOOO} {XXXXXXXXXXX} 0.001635323 1.0000000 611.50000       1
3: {XXXXX00XXXX} {XXXXXX0XXXX} 0.001635323 1.0000000  32.18421       2
4: {XXXXXXX00XX} {XXX0XXXXXXX} 0.001635323 0.5000000 203.83333       3
5: {XXX0XXXXXXX} {XXXXXXX00XX} 0.001635323 0.6666667 203.83333       3  

我想替换“结果”的 lhs 和 rhs 列中的“{”和“}”。我只能使用以下语句运行 gsub 并返回带有 lhs 和 rhs 值的 data.table:

result[,lapply(.SD,gsub,pattern = "{",replacement = "",fixed = T),.SDcols=c("lhs","rhs")][,lapply(.SD,gsub,pattern="}",replacement="",fixed=T)]

我得到的输出:

         lhs           rhs      
1:  XXXXXXXXXXX   XXXXXXXXOOO
2:  XXXXXXXXOOO   XXXXXXXXXXX
3:  XXXXX00XXXX   XXXXXX0XXXX
4:  XXXXXXX00XX   XXX0XXXXXXX
5:  XXX0XXXXXXX   XXXXXXX00XX

但我也想保留 sup、conf、lift 和 itemset 的值。

预期输出:

        lhs           rhs         sup      conf      lift         itemset
1:  XXXXXXXXXXX   XXXXXXXXOOO  0.001635323 1.0000000 611.50000       1
2:  XXXXXXXXOOO   XXXXXXXXXXX  0.001635323 1.0000000 611.50000       1
3:  XXXXX00XXXX   XXXXXX0XXXX  0.001635323 1.0000000  32.18421       2
4:  XXXXXXX00XX   XXX0XXXXXXX  0.001635323 0.5000000 203.83333       3
5:  XXX0XXXXXXX   XXXXXXX00XX  0.001635323 0.6666667 203.83333       3

如何获取其余列的名称?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以做分配来替换我们从lapply得到的输出

    result[,c("lhs", "rhs") := lapply(.SD,gsub,pattern = "[{}]",
           replacement = ""), .SDcols=c("lhs","rhs")]
    result
    #           lhs         rhs         sup      conf      lift itemset
    #1: XXXXXXXXXXX XXXXXXXXOOO 0.001635323 1.0000000 611.50000       1
    #2: XXXXXXXXOOO XXXXXXXXXXX 0.001635323 1.0000000 611.50000       1
    #3: XXXXX00XXXX XXXXXX0XXXX 0.001635323 1.0000000  32.18421       2
    #4: XXXXXXX00XX XXX0XXXXXXX 0.001635323 0.5000000 203.83333       3
    #5: XXX0XXXXXXX XXXXXXX00XX 0.001635323 0.6666667 203.83333       3
    

    【讨论】:

    • 我也试过这种方式:result[,.(c(lapply(.SD,gsub,pattern = "{",replacement = "",fixed = T),sup,conf,lift ,itemset)),.SDcols=c("lhs","rhs")][,.(c(lapply(.SD,gsub,pattern="}",replacement="",fixed=T),sup, conf,lift,itemset)),.SDcols=c("lhs","rhs")] 它说......只要它返回一个列表,我们就会得到带有列的data.table。知道为什么这不起作用吗?
    • @Tushar 没有赋值或set 原始数据集中的列中的值不会更新
    【解决方案2】:
    library('data.table')
    for(col in c("lhs", "rhs")){
      set(result, , col, gsub( "[{}]", '', result[[col]] ) )  # using set() function is faster than `[`. see ?`:=`
    }
    
    result
    #            lhs         rhs         sup      conf      lift itemset
    # 1: XXXXXXXXXXX XXXXXXXXOOO 0.001635323 1.0000000 611.50000       1
    # 2: XXXXXXXXOOO XXXXXXXXXXX 0.001635323 1.0000000 611.50000       1
    # 3: XXXXX00XXXX XXXXXX0XXXX 0.001635323 1.0000000  32.18421       2
    # 4: XXXXXXX00XX XXX0XXXXXXX 0.001635323 0.5000000 203.83333       3
    # 5: XXX0XXXXXXX XXXXXXX00XX 0.001635323 0.6666667 203.83333       3
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 2015-09-28
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多