簡體   English   中英

如何在 R 中使用 data.table 保持唯一的列表列值?

[英]How to keep unique list-column values using data.table in R?

我有一個 dataframe 標識一組具有 id 的值。 比方說:

library(data.table)

dt <- data.table(
  id = rep(c("a", "b", "c"), each = 2),
  value1 = c(1, 1, 1, 2, 1, 1),
  value2 = c(0, 3, 0, 3, 0, 3)
)

如您所見,一個 id 標識多行值,而不是單個值。 我想要做的是只保留標識一組值的第一次出現的 id。 比如上面dataframe中的ac標識的是同一組值,所以我希望結果是:

dt[1:4] # desired output
#>    id value1 value2
#> 1:  a      1      0
#> 2:  a      1      3
#> 3:  b      1      0
#> 4:  b      2      3

我發現這樣做的一種簡單方法是將值組也嵌套到數據框中,然后僅保留基於這個新嵌套的 dataframe 列的唯一條目。 嵌套非常簡單:

dt <- dt[, .(data = list(.SD)), by = id]
dt
#>    id              data
#> 1:  a <data.table[2x2]>
#> 2:  b <data.table[2x2]>
#> 3:  c <data.table[2x2]>

但顯然,實際的“保持獨特事件”是相當棘手的。 我嘗試了兩種不同的方法,但都失敗了。 首先,使用unique.data.table 但是by參數還不支持列表列:

dt <- unique(dt, by = "data")
#> Error in forderv(x, by = by, sort = FALSE, retGrp = TRUE): Column 1 passed to [f]order is type 'list', not yet supported.

然后使用.I[] ,但我無法將列表列傳遞給by參數:

dt <- dt[dt[, .I[1], by = data]$V1]
#> Error: column or expression 1 of 'by' or 'keyby' is type list. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))]

我在這上面花了很多時間,但我似乎無法弄清楚如何實現我想要的。 我不一定依附於“nest -> keep unique dataframe”路徑,但這是解決我能想到的問題的唯一方法。

我們可以使用duplicated with unnest

library(tidyr)
dt[, .(data = list(.SD)), by = id][!duplicated(data)] %>%
   unnest(data)

-輸出

# A tibble: 4 × 3
  id    value1 value2
  <chr>  <dbl>  <dbl>
1 a          1      0
2 a          1      3
3 b          1      0
4 b          2      3

本着@akrun 回答的精神,但將data.table保持為唯一的依賴項:

library(data.table)

dt <- data.table(
  id = rep(c("a", "b", "c"), each = 2),
  value1 = c(1, 1, 1, 2, 1, 1),
  value2 = c(0, 3, 0, 3, 0, 3)
)

dt <- dt[, .(data = list(.SD)), by = id]
dt <- dt[!duplicated(data)]
dt[, unlist(data, recursive = FALSE), by = id]
#>    id value1 value2
#> 1:  a      1      0
#> 2:  a      1      3
#> 3:  b      1      0
#> 4:  b      2      3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM