我有一个数据表,我想复制或子集到变量中所有唯一的观察值,变量名包含某个子串.我可以想出一种方法来笨拙地使用for循环,但这似乎 destruct 了数据表的实用性和速度.

例如:

library(data.table)
library(dplyr)
dt <- setDT(tibble(a_ID = c(1, 1, 2, 11, 2),
                   b = c('x','y','z','z', 'x'),
                   b_ID = c('XY','XY','XY','XY', 'XY'),
                   d = 1:5))

我想从这里做的是由名称包含"ID"的所有列组成的子集,只返回每个列的唯一条目,因为这将导致每个列的观察量不同,所以用NA填充其余的列.

也就是说,我想返回以下内容:

subset_dt <- setDT(tibble(a_ID = c(1,2,11),
                          b_ID = c('XY', NA,NA)))

这是否可能与数据有关.桌子功能?

推荐答案

我们可以得到unique个元素,然后得到replaceduplicatedNA

library(data.table)
dt[, lapply(.SD, unique), .SDcols = patterns("_ID$")][,
    lapply(.SD, \(x) replace(x, duplicated(x), NA))]

-输出

    a_ID   b_ID
   <num> <char>
1:     1     XY
2:     2   <NA>
3:    11   <NA>

或者另一个unique的选项

unique(dt[, .(a_ID, b_ID)])[, lapply(.SD, \(x) fcase(!duplicated(x), x))]
    a_ID   b_ID
   <num> <char>
1:     1     XY
2:     2   <NA>
3:    11   <NA>

或者另一个选项是阻止代码,判断unique步后的length秒,并附加NA以固定长度

dt[, {lst1 <- lapply(.SD, unique)
     mx <- max(lengths(lst1))
    lapply(lst1, `length<-`, mx)}, .SDcols = patterns("_ID$")]
    a_ID   b_ID
   <num> <char>
1:     1     XY
2:     2   <NA>
3:    11   <NA>

我们也可以使用collapse—— Select 列(gvr),获得唯一的行(funique),使用dapply循环列,使用NA循环重复项

library(collapse)
dapply(funique(gvr(dt, "_ID$")), MARGIN = 2, 
   FUN = \(x) replace(x, duplicated(x), NA))
    a_ID   b_ID
   <num> <char>
1:     1     XY
2:     2   <NA>
3:    11   <NA>

R相关问答推荐

使用lares::corr_var函数在for循环中分配变量的问题

如何将y轴上的线定位得彼此更近

使用na.locf在长格式数据集中输入具有多个时间点的数据集

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

向gggplot 2中的数据和轴标签添加大写和星号

随机森林回归:下拉列重要性

使用tidy—select创建一个新的带有mutate的摘要变量

为什么我的基准测试会随着样本量的增加而出现一些波动?

如何从像glm这样的模型中提取系数表的相关性?

在R中使用Scale_y_Break后更改y轴标签

仅 Select 超过9行的CSV文件

将选定的索引范围与阈值进行比较

列名具有特殊字符时的循环回归

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

将列的值乘以在不同数据集中找到的值

如果条件匹配,则使用Mariate粘贴列名

无法将条件case_when()应用于使用!!创建的新变量Mutations

如何显示准确的p值而不是<;0.001*?

为什么将负值向量提升到分数次方会得到NaN

Ggplot2如何找到存储在对象中的残差和拟合值?