我试图在我的datatable中创建多个列,这些列表示按行匹配给定模式的列的总和.

df <- data.frame(first_column = c("Alpha", "Beta", "Charlie", "Tango", "Alpha, Beta,Alpha", "Alpha,Beta,Charlie", 'Tango,Tango,Tango,Tango', 'Tango,Tango,Tango, Tango', 'Tango,Tango,Tango, Tango , Alpha,Beta,Charlie, Alpha, Alpha ,Alpha '),
                 number_1 = 1:9,
                 number_2 = 11:19,
                 number_3 = 2:10,
                 number_4 = 12:20) 

testing <- df %>%
  mutate(number_1 = as.numeric(number_1),
         number_2 = as.numeric(number_2))%>%
  as.data.table 


testing3 = testing[,`:=` ("Total 1" = Reduce(`+`, grep("number_1|number_2", names(testing), value = TRUE)),
                          "Total 2" = Reduce(`+`, grep("number_3|number_4", names(testing), value = TRUE)))]

这就是我一直试图go 做的,但都没有用.我应该看到的是总共1排1,12和总共2排1,14

但我不能这样做.

推荐答案

原因是grep只返回带有value = TRUE的列名,我们需要列的值,使用.SD从列名中子集列

library(data.table)
testing[,`:=` (
   "Total 1" = Reduce(`+`, .SD[, grep("number_1|number_2", names(.SD),
              value = TRUE), with = FALSE]),
    "Total 2" = Reduce(`+`, .SD[, grep("number_3|number_4", names(.SD), 
     value = TRUE), with = FALSE]))]

-输出

> testing
                                                          first_column number_1 number_2 number_3 number_4 Total 1 Total 2
                                                                <char>    <num>    <num>    <int>    <int>   <num>   <int>
1:                                                               Alpha        1       11        2       12      12      14
2:                                                                Beta        2       12        3       13      14      16
3:                                                             Charlie        3       13        4       14      16      18
4:                                                               Tango        4       14        5       15      18      20
5:                                                   Alpha, Beta,Alpha        5       15        6       16      20      22
6:                                                  Alpha,Beta,Charlie        6       16        7       17      22      24
7:                                             Tango,Tango,Tango,Tango        7       17        8       18      24      26
8:                                            Tango,Tango,Tango, Tango        8       18        9       19      26      28
9: Tango,Tango,Tango, Tango , Alpha,Beta,Charlie, Alpha, Alpha ,Alpha         9       19       10       20      28      30

如果有多个集合,我们还可以创建一个命名的listFilter根据名称的出现来 Select list个元素

lst_names <- list(c("number_1", "number_2"), 
                 c("number_3", "number_4"), 
                 c("number_5", "number_6"))
names(lst_names) <- paste("Total", seq_along(lst_names))
lst_names_sub <- Filter(length, lapply(lst_names, function(x)
        intersect(x, names(testing))))
testing[, names(lst_names_sub) := lapply(lst_names_sub, function(x) 
         Reduce(`+`, .SD[, x, with = FALSE]))]

R相关问答推荐

行式dppr中的变量列名

无法将传奇添加到cowplot多情节中

编辑文件后编辑RhandsonTable

次级y轴R gggplot2

将向量组合到一个数据集中,并相应地命名行

RStudio中相关数据的分组箱形图

R中插入符号训练函数的中心因子和尺度因子预测

R spatstat Minkowski Sum()返回多个边界

如何在科学记数法中显示因子

如何移除GGPlot中超出与面相交的任何格网像元

远离理论值的伽马密度曲线下面积的近似

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

在ggplot2上从多个数据框创建复杂的自定义图形

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

将某个阈值以下的列中的值分类到不同的列中,否则保持该列的原样

如何在不使用SHINY的情况下将下拉滤镜列表添加到ggploy?

对计算变量所有唯一值的变量进行变异

R:部分修改矩阵对角线的有效方法

同时使用Scale_y_Break和Scale_x_Continue时,X轴值出现两次

基于日期输入的子集数据集,其中应包括NAS作为 Select