首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从输入向量动态创建数据表中的新列

从输入向量动态创建数据表中的新列
EN

Stack Overflow用户
提问于 2019-03-15 08:28:45
回答 1查看 81关注 0票数 1

因此,我尝试在现有data.table中动态创建新列,而不使用eval(parse())选项。

data.table如下

代码语言:javascript
复制
library(data.table)
dt<-data.table(
  Jan01 = c(1:12), 
  Feb01 = c(100:111),
  Mar01 = c(25:36),
  Jan02 = c(5:10), 
  Feb02 = c(13:24),
  Mar02 = c(25:36),
  Jan03 = c(60:61), 
  Feb03 = c(70:71),
  Mar03 = c(40:51))

这将返回以下data.table

代码语言:javascript
复制
    Jan01 Feb01 Mar01 Jan02 Feb02 Mar02 Jan03 Feb03 Mar03
 1:     1   100    25     5    13    25    60    70    40
 2:     2   101    26     6    14    26    61    71    41
 3:     3   102    27     7    15    27    60    70    42
 4:     4   103    28     8    16    28    61    71    43
 5:     5   104    29     9    17    29    60    70    44
 6:     6   105    30    10    18    30    61    71    45
 7:     7   106    31     5    19    31    60    70    46
 8:     8   107    32     6    20    32    61    71    47
 9:     9   108    33     7    21    33    60    70    48
10:    10   109    34     8    22    34    61    71    49
11:    11   110    35     9    23    35    60    70    50
12:    12   111    36    10    24    36    61    71    51

我想要做的是将所有01列求和为一列,02列等。下面的代码显示这是一个长格式

代码语言:javascript
复制
dt <- dt[, ':=' (
            All01 = (Jan01 + Feb01 + Mar01),
            All02 = (Jan02 + Feb02 + Mar02),
            All03 = (Jan03 + Feb03 + Mar03)
            )]

这将产生下表

代码语言:javascript
复制
    Jan01 Feb01 Mar01 Jan02 Feb02 Mar02 Jan03 Feb03 Mar03 All01 All02 All03
 1:     1   100    25     5    13    25    60    70    40   126    43   170
 2:     2   101    26     6    14    26    61    71    41   129    46   173
 3:     3   102    27     7    15    27    60    70    42   132    49   172
 4:     4   103    28     8    16    28    61    71    43   135    52   175
 5:     5   104    29     9    17    29    60    70    44   138    55   174
 6:     6   105    30    10    18    30    61    71    45   141    58   177
 7:     7   106    31     5    19    31    60    70    46   144    55   176
 8:     8   107    32     6    20    32    61    71    47   147    58   179
 9:     9   108    33     7    21    33    60    70    48   150    61   178
10:    10   109    34     8    22    34    61    71    49   153    64   181
11:    11   110    35     9    23    35    60    70    50   156    67   180
12:    12   111    36    10    24    36    61    71    51   159    70   183

在创建函数之前,我曾尝试使用下面的代码在一年内对其进行测试,但不起作用

代码语言:javascript
复制
x <- "01"

dt1<-dt[, ':=' (paste0("All",x) = (paste0("Jan",x) + paste0("Feb",x) + paste0("Mar", x)]

其中包含以下错误

代码语言:javascript
复制
Error: unexpected '=' in "dt1<-dt[, ':=' (paste0("All",x) ="

最终的目标是做这样的事情

代码语言:javascript
复制
myfunction<-function(Year){
  dt[, ':=' (paste0("All",Year) = (paste0("Jan",Year) + paste0("Feb",Year) + paste0("Mar", Year)]
}

obj <- lapply(c("01","02", "03"), Year)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 08:43:52

代码语言:javascript
复制
myfunction <- function(Year) {
    dt[, paste0("All", Year) := rowSums(.SD), .SDcols = grep(paste0(Year, "$"), names(dt))]
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55173928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档