【问题标题】:Collapse rows with complementary column data in a data.table in r在 r 中的 data.table 中折叠具有互补列数据的行
【发布时间】:2021-06-11 00:27:31
【问题描述】:

我需要折叠 data.table 中部分重复的行

例子:

  df.in <- data.table (
  tkr = c("abc", "abc", "def", "def", "ghi", "ghi"),
  lboq = c(0,296, -390, 0,  -88, 0),
  locq = c(-296,0, 0, 390, 0, 88),
  ap = c(134,134, 23, 23, 17, 17)
  )

     tkr lboq locq  ap
  1: abc    0 -296 134
  2: abc  296    0 134
  3: def -390    0  23
  4: def    0  390  23
  5: ghi  -88    0  17
  6: ghi    0   88  17

使用这个例子,我想得到三行,其中第二行折叠成第一行,第 2 列有 296;第 4 行的 390 将在第 3 行的第 3 列中,依此类推。

所以想要的结果是:

  df.out <- data.table (
  tkr = c("abc", "def", "ghi"), 
  lboq = c(296, -390, -88),
  lbcq = c(-296, 390, 88),
  ap = c(134, 23, 17)
  )

     tkr lboq lbcq  ap
  1: abc  296 -296 134
  2: def -390  390  23
  3: ghi  -88   88  17

我已经研究了以下反应:

collapse rows in 2 different columns in data.table?

collapse rows in data.table

尽管有上述两个标题,但它们看起来更像是扩张而不是崩溃

我还在下面探索了使用合并,但这似乎仅适用于列;行有合并吗?

Coalesce two string columns with alternating missing values to one

Use dplyr coalesce in programming

How to use Coalesce function on a dataframe

然后我看了

R Summarize Collapsed Data.Table

但是这里的折叠已经完成,需要总结;我需要做折叠

这看起来正是我所需要的

Merging complementary rows of a dataframe with R

但让它适应我的使用似乎不起作用:

    df.in %>%
      group_by(tkr, ap) %>%
      summarise_all(funs(sort(.)[1]))

我错过了什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    也许这会有所帮助:

    library(dplyr)
    
    df.in %>%
      group_by(tkr) %>%
      summarise(across(lboq:ap, ~.x[.x != 0][1]))
    
    #  tkr    lboq  locq    ap
    #* <chr> <dbl> <dbl> <dbl>
    #1 abc     296  -296   134
    #2 def    -390   390    23
    #3 ghi     -88    88    17
    

    对于每个tkr,这会选择lboq:ap 列中的第一个非零值。

    【讨论】:

    • 谢谢!更多咖啡来了! (对我来说很明显,我还不能完全内化波浪线和圆点的使用)。我已经能够成功地使您的解决方案适应我更大的数据集,但括号中的“[1]”提示了两个问题:1)这似乎是across 语法的一部分,但我看不到任何解释它在?across; 2)我较大的数据集有四对我在示例中使用的(“lboq”和“locq”),并且您的代码工作正常。我不是在抱怨(!),但这让我想知道您的评论“第一个非零值”是什么意思。
    • 对于共享的示例,可能有两种情况。 1)当有一个零值和另一个非零值时。(Eg - lboq for abc) 2)当值相同时(例如 - ap for abc)。在您的实际数据中,您是否还有另一种情况,即一组的一列中有 10、12 之类的值,在这种情况下您将选择哪个值?如果答案是否定的,那么实际数据中不会出现这种情况,那么无需担心答案会按预期工作,但如果可能存在这种情况,[1] 将确保选择 10 而不是 12我们只需要选择一个值。
    • @RonakShah 我怎样才能使它适用于char 类型的列?我的示例类似于 OP 问题,但 lboq:ap ara 字符与 NAs 没有任何价值
    • 你可以使用~na.omit(.x)[1]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多