如何用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
相关产品推荐
相关产品推荐

