相关疑难解决方法(0)

当变量名存储在字符向量中时,选择/分配给data.table

data.table如果变量名存储在字符向量中,如何引用变量?例如,这适用于data.frame:

df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
#   col1
# 1    4
# 2    5
# 3    6
Run Code Online (Sandbox Code Playgroud)

如何使用或不使用:=表示法对data.table执行相同的操作?显而易见的事情是dt[ , list(colname)]行不通的(我也没想到).

r data.table

78
推荐指数
3
解决办法
2万
查看次数

如何在R中的data.table中完全使用变量中的列名

首先:感谢@MattDowle; data.table是我开始使用以来发生过的最好的事情之一R.

第二:我知道变量列名的各种用例的许多变通方法data.table,包括:

  1. 选择/赋值data.table变量,这些变量名称存储在字符向量中
  2. 使用R中的变量在data.table中传递列名
  3. 通过保存在变量中的名称引用data.table列
  4. 以编程方式将列名称传递给data.table
  5. Data.table元编程
  6. 如何编写一个调用调用data.table的函数的函数?
  7. 在`data.table`中使用动态列名
  8. data.table,R中的动态列名
  9. 使用以下内容分配多个列:= data.table,group
  10. 使用data.table在"group by"操作中设置列名
  11. R使用data.table汇总多个列

可能更多我没有参考.

但是:即使我学会了上面记录的所有技巧,以至于我从来不必查看它们以提醒自己如何使用它们,我仍然会发现使用作为参数传递给函数的列名非常繁琐的任务.

我正在寻找的是以下解决方法/工作流程的"最佳实践认可"替代方案.考虑到我有一堆类似数据的列,并希望对这些列或它们的集合执行一系列类似的操作,其中操作具有任意高的复杂性,并且列名称组传递给指定的每个操作在变量中.

我意识到这个问题听起来很人为,但我却以惊人的频率遇到它.这些例子通常非常混乱,很难将与这个问题相关的功能分开,但我最近偶然发现了一个相当简单的简化用作MWE的方法:

library(data.table)
library(lubridate)
library(zoo)

the.table <- data.table(year=1991:1996,var1=floor(runif(6,400,1400)))
the.table[,`:=`(var2=var1/floor(runif(6,2,5)),
                var3=var1/floor(runif(6,2,5)))]

# Replicate data across months
new.table <- the.table[, list(asofdate=seq(from=ymd((year)*10^4+101),
                                           length.out=12,
                                           by="1 month")),by=year]

# Do a complicated procedure to each variable in some group.
var.names <- c("var1","var2","var3")

for(varname in var.names) {
    #As suggested in an answer to Link 3 above
    #Convert the column name to a …
Run Code Online (Sandbox Code Playgroud)

r calculated-columns programmatically-created data.table

48
推荐指数
2
解决办法
4740
查看次数

在`data.table`中使用动态列名

我想计算data.table中每个列的平均值,按另一列分组.我的问题类似于关于SO的另外两个问题(一个两个),但我不能将这些问题应用于我的问题.

这是一个例子:

library(data.table)
dtb <- fread(input = "condition,var1,var2,var3
      one,100,1000,10000
      one,101,1001,10001
      one,102,1002,10002
      two,103,1003,10003
      two,104,1004,10004
      two,105,1005,10005
      three,106,1006,10006
      three,107,1007,10007
      three,108,1008,10008
      four,109,1009,10009
      four,110,1010,10010")

dtb
#    condition var1 var2  var3
# 1:       one  100 1000 10000
# 2:       one  101 1001 10001
# 3:       one  102 1002 10002
# 4:       two  103 1003 10003
# 5:       two  104 1004 10004
# 6:       two  105 1005 10005
# 7:     three  106 1006 10006
# 8:     three  107 1007 10007
# 9:     three …
Run Code Online (Sandbox Code Playgroud)

r data.table

32
推荐指数
1
解决办法
2万
查看次数

根据正则表达式选择data.table列

如何根据正则表达式选择data.table的列?考虑一个简单的例子如下:

library(data.table)
mydt <- data.table(foo=c(1,2), bar=c(2,3), baz=c(3,4))
Run Code Online (Sandbox Code Playgroud)

有没有办法根据正则表达式使用数据表中的列barbaz来自数据表?我知道以下解决方案有效,但如果表格更大,我想选择更多变量,这很容易变得麻烦.

mydt[, .(bar, baz)]
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西matches(),dplyr::select()但只能通过参考.

regex r data.table

19
推荐指数
5
解决办法
1万
查看次数

如何在函数内将 R data.table 列名与 cube(..., j = ,...) 一起使用?

我可以获得由其他变量分层的变量的摘要,如下所示:

require(data.table)

DT <- data.table(mtcars)

var_work <- "hp"
by_vars <- c("cyl", "carb")

ans_1 <- cube(DT, j = as.list(quantile(get(var_work))), by = by_vars)

ans_1
    cyl carb  0%    25%   50%    75% 100%
 1:   6    4 110 110.00 116.5 123.00  123
 2:   4    1  65  66.00  66.0  93.00   97
 3:   6    1 105 106.25 107.5 108.75  110
 4:   8    2 150 150.00 162.5 175.00  175
 5:   8    4 205 218.75 237.5 245.00  264
 6:   4    2  52  69.25  93.0 105.50  113
 7:   8    3 …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
268
查看次数

按列索引号过滤 data.table R

有趣的是,我无法找到使用列号进行过滤的方法。我不知道该列的名称,因为它改变了名称,但我总是知道该列的位置。

这看起来很简单,但似乎我只能使用列名称引用 i 部分。

table = data.table(one = c(1,2,3), two = c("a","b","c"))

> table
   one two
1:   1   a
2:   2   b
3:   3   c
Run Code Online (Sandbox Code Playgroud)

我不知道第二列是“二”。我只想按第二列过滤。

> table[two == "a"]
   one two
1:   1   a
Run Code Online (Sandbox Code Playgroud)

更新:

正如罗纳克所描述的,我可以使用

> table[table[[2]]=="a"]

   one two
1:   1   a
Run Code Online (Sandbox Code Playgroud)

不过,我接下来想更新同一列,例如我想将“a”变成“c”。

我需要的:

> table
   one two
1:   1   c
2:   2   b
3:   3   c
Run Code Online (Sandbox Code Playgroud)

我努力了:

> table[table[[2]]=="a", table[[2]]:= "c"]
> table
   one two    a    b    c
1:   1   a    c    c    c
2:   2   b …
Run Code Online (Sandbox Code Playgroud)

r data.table

4
推荐指数
1
解决办法
1660
查看次数

i中的子集由data.table中的变量名称设置

假设我有一个data.table,其中包含在变量中指定的列名.例如,我可能用过dcast:

groups <- sample(LETTERS, 2) # i.e. I don't now the values
dt1 <- data.table(ID = rep(1:2, each = 2), group = groups, value = 3:6)
(dt2 <- dcast(dt1, ID~group, value.var = "value"))
#    ID D Q
# 1:  1 3 4
# 2:  2 5 6
Run Code Online (Sandbox Code Playgroud)

现在我想基于最后两列中的值进行子集化,例如执行以下操作:

dt2[groups[1] == 3 & groups[2] == 4]
# Empty data.table (0 rows) of 3 cols: ID,D,Q
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?我发现我可以用键做到这一点:

setkeyv(dt2, groups)
dt2[.(3, 4)]
#    ID D Q
# 1:  1 3 4 …
Run Code Online (Sandbox Code Playgroud)

r data.table

2
推荐指数
1
解决办法
390
查看次数

用data.table准报价

我试图将我的头缠在准引号上,以便可以与data.table电话一起使用。这是一个例子:

library(data.table)
library(rlang)
dt <- data.table(col1 = 1:10, col2 = 11:20)

dt[, col1]
Run Code Online (Sandbox Code Playgroud)

如果我想将其包装到函数中,该怎么做?我试过了:

foo <- function(dt, col) {
  col <- quo(col)

  expr(dt[, !!col1])
}

foo(dt, col1)
Run Code Online (Sandbox Code Playgroud)

但是得到Error in enexpr(expr) : object 'col1' not found。我认为我缺少一些步骤,因此data.table对的评价与有所不同dplyr

r data.table rlang quasiquotes

2
推荐指数
1
解决办法
74
查看次数