相关疑难解决方法(0)

什么.SD代表R中的data.table

.SD看起来很有用,但我真的不知道我在做什么.它代表什么?为什么会有前一段时间(句号).我用它时发生了什么?

我读到: .SD是一个data.table包含x每个组的数据子集,不包括组列.它可以在分组i时,分组by,键控by和_ad hoc_时使用by

这是否意味着女儿data.table被留在内存中进行下一次操作?

r data.table

159
推荐指数
3
解决办法
6万
查看次数

使用变量在data.table中传递列名

可能重复:
可变地选择/分配data.table中的字段

在下面的示例中,我创建了一个列名为"x"和"v"的数据表

library('data.table')
DT <- data.table(x = c("b","b","b","a","a"), v = rnorm(5))
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式访问列'x'的值:

DT[ , x]
# [1] "b" "b" "b" "a" "a"
Run Code Online (Sandbox Code Playgroud)

但是如果我想通过传递变量来访问它,它就不起作用

temp <- "x"
DT[ , temp]
# [1] "x"
Run Code Online (Sandbox Code Playgroud)

将有多个列,我将只为其中几个选择值.我将通过R模块提供这些列名.

没关系,我明白了,它应该是:

DT[ , get(temp)]
Run Code Online (Sandbox Code Playgroud)

r data.table

85
推荐指数
1
解决办法
8万
查看次数

当变量名存储在字符向量中时,选择/分配给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
查看次数

在列的子集(.SDcols)上应用函数,同时在另一列(在组内)应用不同的函数

这非常类似于将一个共同功能应用于一个data.table完整.SDcols 答案的多个列的问题.

不同之处在于我想同时在不属于.SD子集的另一列上应用不同的函数.我在下面发布一个简单的例子来展示我尝试解决问题:

dt = data.table(grp = sample(letters[1:3],100, replace = TRUE),
                v1 = rnorm(100), 
                v2 = rnorm(100), 
                v3 = rnorm(100))
sd.cols = c("v2", "v3")
dt.out = dt[, list(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,  
: object 'v1' not found
Run Code Online (Sandbox Code Playgroud)

现在这是有道理的,因为v1列不包含在必须首先计算的列子集中.所以我通过将其包含在我的列子集中进一步探索:

sd.cols = c("v1","v2", "v3")
dt.out = dt[, list(sum(v1), lapply(.SD,mean)), by = grp, .SDcols = …
Run Code Online (Sandbox Code Playgroud)

r subset lapply data.table

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

使用列名称的字符向量访问data.table中的列

假设我有一个R data.table:

 DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
Run Code Online (Sandbox Code Playgroud)

我有一个我想要提取的列名字符向量,或者更一般地操作:

cols = c("x","y")
Run Code Online (Sandbox Code Playgroud)

例如,我如何使用cols生成等效的

 DT[,lapply(.SD[,list(x,y)], min) ]
Run Code Online (Sandbox Code Playgroud)

有没有办法使用cols向量指定列表(x,y)?

r data.table

8
推荐指数
1
解决办法
6247
查看次数

在data.table或dplyr中的列之间计算?

我想用来data.table为大型数据集实现一个非常简单的任务.

计算每个ID的val1和val2的平均值.

有关详细信息,请参阅附带的虚假数据.

library(data.table)
DT <- data.table(ID = paste0("ID",rep(1:5,each=2)),
      level= rep(c("CTRL","CTRL","ID1","ID2","ID3"),2),
      val1 = 1:10, 
      val2 = rnorm(10))
Run Code Online (Sandbox Code Playgroud)

在这里,我想计算每个ID,val1和val2的平均值.

另请注意,在每个ID中,都有不同的级别.但是对于每个唯一ID,我只想要一个包含不同级别val1和val2的意思.

--- ID | 意思 - -

- ID1 | ...

- ID2 | ...

- ID3 | ...

我尝试了以下代码,但它不起作用.

topagents <- DT[, mean = mean(list(val1,val2)), 
                    by = ID]
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我知道怎么做reshape2,先是melt然后dcast.

但原始数据集相对较大,有20M行和12个字段,进行计算需要相当长的时间.

所以我更喜欢使用data.tabledplyr.

r dplyr data.table

8
推荐指数
4
解决办法
1330
查看次数

使用data.table计算所有数字列的汇总统计信息(例如均值)

我有两列numeric和非numeric列的数据,如下所示:

mydt
          vnum1 vint1 vfac1 vch1
 1: -0.30159484     8     3    E
 2: -0.09833430     8     1    D
 3: -2.15963282     1     3    D
 4:  0.03904374     5     2    B
 5:  1.54928970     4     1    C
 6: -0.73873654     5     1    A
 7: -0.68594479     9     2    B
 8:  1.35765612     1     2    E
 9:  1.46958351     2     1    B
10: -0.89623979     2     4    E
Run Code Online (Sandbox Code Playgroud)

如何仅选择numeric列并计算其mean使用data.table

我试过这个:

mydt[ , lapply(.SD, mean), ]
#        vnum1 vint1 vfac1 vch1
# 1: …
Run Code Online (Sandbox Code Playgroud)

r data.table

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