我有dataframe一个如下:
x <- data.table(Tickers=c("A","A","A","B","B","B","B","D","D","D","D"),
Type=c("put","call","put","call","call","put","call","put","call","put","call"),
Strike=c(35,37.5,37.5,10,11,11,12,40,40,42,42),
Other=sample(20,11))
Tickers Type Strike Other
1: A put 35.0 6
2: A call 37.5 5
3: A put 37.5 13
4: B call 10.0 15
5: B call 11.0 12
6: B put 11.0 4
7: B call 12.0 20
8: D put 40.0 7
9: D call 40.0 11
10: D put 42.0 10
11: D call 42.0 1
Run Code Online (Sandbox Code Playgroud)
我正在尝试分析数据的一个子集.我想要的子集是数据,其中ticker和strike是相同的.但是,如果a put和a都call存在,我也只想获取这些数据type.以上面的数据为例,我想返回以下结果:
x[c(2,3,5,6,8:11),] …Run Code Online (Sandbox Code Playgroud) 这是我之前的问题的后续问题: 如何提取每组前n行并使用该子集计算函数?
另一篇相关文章:如何提取每组前n行?
我有以下数据:
set.seed(1)
dt1 <- data.table(ticker="aa",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
dt2 <- data.table(ticker="aapl",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
dt3 <- data.table(ticker="abc",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
myList <- list(dt1,dt2,dt3)
Run Code Online (Sandbox Code Playgroud)
我想在一个特定的索引上按函数输出取决于子集化的数据帧,对这个数据应用一个函数.然后,我想用不同的分组变量对结果data.table进行分组,并采用简单的方法.
我想首先通过group1在子集化行上计算我的函数,rbindlist结果,然后通过group2计算平均值?
或者我想首先对我的整个数据进行rbindlist,预先选择子集行,然后通过group1计算我的函数然后按group2计算均值?
# data.table version of function
dt_calc_perf <- function(dt){
buy <- ifelse(dt$x > mean(dt$y),1,0)
dt$perf <- buy*(dt$x/dt$y-1)
return(dt)
}
# vector return version of function
calc_perf <- function(dt){
buy <- ifelse(dt$x > mean(dt$y),1,0)
perf <- buy*(dt$x/dt$y-1)
return(perf)
}
# which is faster?
# method 1
method1 <- function(){
res1 <- rbindlist(lapply(1:length(myList),
function(m) dt_calc_perf(myList[[m]][1:1000])))
res1 <- res1[,list('perf'=mean(perf),'tickers'=paste(ticker,collapse=',')),
by=letters]
}
# method …Run Code Online (Sandbox Code Playgroud) 这个问题非常类似于如何在data.table中对每个组中的随机行进行采样?.
差异在于一个微小的微妙之处,我没有足够的声誉来讨论这个问题本身.
让我们稍微改变一下Christopher Manning的初始数据:
> DT = data.table(a=c(1,1,1,1:15,1,1), b=sample(1:1000,20))
> DT
a b
1: 1 102
2: 1 5
3: 1 658
4: 1 499
5: 2 632
6: 3 186
7: 4 761
8: 5 150
9: 6 423
10: 7 832
11: 8 883
12: 9 247
13: 10 894
14: 11 141
15: 12 891
16: 13 488
17: 14 101
18: 15 677
19: 1 400
20: 1 467
Run Code Online (Sandbox Code Playgroud)
如果我们尝试了问题的解决方案:
> DT[,.SD[sample(.N,3)],by = a] …Run Code Online (Sandbox Code Playgroud) 假设我有以下内容 data.frame
> df <- data.frame(a=rep(1:3),b=rep(1:3),c=rep(4:6),d=rep(4:6))
> df
a b c d
1 1 1 4 4
2 2 2 5 5
3 3 3 6 6
Run Code Online (Sandbox Code Playgroud)
我希望能够将其拆分df为两个框架df1和df2. 我想df1是的前两列df和df2是的两列df。有没有办法在代码中做到这一点,这样我就不必手动执行以下操作:
> df1 <- df[,1:2]
> df1
a b
1 1 1
2 2 2
3 3 3
> df2 <- df[,3:4]
> df2
c d
1 4 4
2 5 5
3 6 6
Run Code Online (Sandbox Code Playgroud)
这会很好,因为我正在处理的问题有可变数量的列,我只想能够创建n = …
我的问题与这个问题非常相似: 如何提取每个组的前n行?
dt
date age name val
1: 2000-01-01 3 Andrew 93.73546
2: 2000-01-01 4 Ben 101.83643
3: 2000-01-01 5 Charlie 91.64371
4: 2000-01-02 6 Adam 115.95281
5: 2000-01-02 7 Bob 103.29508
6: 2000-01-02 8 Campbell 91.79532
Run Code Online (Sandbox Code Playgroud)
我们有一个dt,我添加了一个名为的额外列val。首先,我们要提取每个组中的前n行。提供的链接中的解决方案是:
dt[, .SD[1:2], by=date] # where 1:2 is the index needed
dt[dt[, .I[1:2], by = date]$V1] # for speed
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果该函数取决于子集信息,那么该如何将函数应用于每个组的前n行。我正在尝试应用这样的事情:
# uses other columns for results/ is dependent on subsetted rows
# but keep it simple for replication
do_something …Run Code Online (Sandbox Code Playgroud)