You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R的data.table生成各列唯一值组成的新data.table?

生成包含各列唯一值的data.table

嘿,我来帮你搞定这个需求!要从源data.table生成各列仅含唯一值的新表,且列数与原表一致、不足的位置用NA填充,这有两种高效的实现方式:

先准备源数据

首先咱们先把示例里的源数据表搭好:

library(data.table)
library(lubridate)

sourceDT <- data.table(
  ID = c(1,2,3,4), 
  date = c(ymd("20110101"),ymd("20110101"),ymd("20130101"),ymd("20150101")), 
  text = c("A","B","C","C")
)

方法一:直接处理每列(直观易懂)

这种方式先提取每列的唯一值,再统一对齐长度补NA,逻辑非常清晰:

# 1. 提取每列的唯一值,得到一个列表
unique_col_values <- lapply(sourceDT, unique)

# 2. 找到所有列中唯一值最多的数量,作为新表的行数
max_row_count <- max(sapply(unique_col_values, length))

# 3. 把每个列的唯一值补NA到目标行数,再组合成新的data.table
outputDT <- data.table(
  lapply(unique_col_values, function(col_vals) {
    c(col_vals, rep(NA, max_row_count - length(col_vals)))
  })
)

运行后得到的结果和你想要的完全一致:

outputDT
#    ID       date text
# 1:  1 2011-01-01    A
# 2:  2 2013-01-01    B
# 3:  3 2015-01-01    C
# 4:  4       <NA> <NA>

方法二:利用转置操作(简洁高效)

如果你习惯用转置来处理列和行的转换,也可以试试这种方式:

# 1. 转置源表,对每一行(对应原表的列)取唯一值
transposed_unique <- lapply(transpose(sourceDT), unique)

# 2. 再次转置回来,并用fill参数自动补NA
outputDT2 <- transpose(transposed_unique, fill = NA)

# 3. 给新表设置和原表一致的列名
setnames(outputDT2, names(sourceDT))

这个方法的结果和方法一完全相同,代码更简洁,适合熟悉data.table转置特性的同学。

内容的提问来源于stack exchange,提问作者LeGeniusII

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:14