【问题标题】:data.table: assign to columns by column name matchingdata.table:通过列名匹配分配给列
【发布时间】:2016-02-02 16:01:21
【问题描述】:

假设我有一个数据表

> dt = data.table(Faaa = c(1,2,NA), Fbbb = c(2,NA,3), date = as.IDate(c("2010-01-01", "2010-01-02", NA)))
> dt
   Faaa Fbbb       date
1:    1    2 2010-01-01
2:    2   NA 2010-01-02
3:   NA    3       <NA>

假设有很多名称以 F 开头的列。我希望对于名称以 F 开头的每一列,用列均值来估算 NA,而不是日期(和任何其他)列。

对于这个问题,F列是相邻的,所以我可以通过索引访问,只是想知道是否有一个聪明的方法让我不需要对列索引进行硬编码。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以为此使用grepna.aggregate 中的na.aggregate

    library(data.table)
    library(zoo)
    
    dt <- data.table(Faaa = c(1,2,NA), Fbbb = c(2,NA,3), date = as.IDate(c("2010-01-01", "2010-01-02", NA)))
    
    cols = grep("^F", names(dt), value = TRUE)
    dt[, (cols) := lapply(.SD, na.aggregate),.SDcols = cols]
    

    结果:

       Faaa Fbbb       date
    1:  1.0  2.0 2010-01-01
    2:  2.0  2.5 2010-01-02
    3:  1.5  3.0       <NA>
    

    【讨论】:

    • @akrun 我想做得更简单,只用一行。使用 dplyr 会是: dt %>% mutate(across(contains("^F"),na.aggregate)) 为什么这不起作用? dt[, (names(.SD)) := lapply(.SD, na.aggregate), .SDcols = patterns("^F")] 应该怎么写?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2014-05-23
    相关资源
    最近更新 更多