[英]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中的a
和c
標識的是同一組值,所以我希望結果是:
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.