提前感谢您阅读本文.我有一个在data.table 1.9.3上工作正常的函数.但今天我更新了我的data.table包,我的功能不起作用.
这是我在data.table 1.9.3上的函数和工作示例:
trait.by <- function(data,traits="",cross.by){
traits = intersect(traits,names(data))
if(length(traits)<1){
#if there is no intersect between names and traits
return( data[, list(N. = .N), by=cross.by])
}else{
return(data[,c( N. = .N,
MEAN = lapply(.SD,function(x){return(round(mean(x,na.rm=T),digits=1))}) ,
SD = lapply(.SD,function(x){return(round(sd (x,na.rm=T),digits=2))}) ,
'NA' = lapply(.SD,function(x){return(sum (is.na(x)))})),
by=cross.by, .SDcols = traits])
}
}
> trait.by(data.table(iris),traits = c("Sepal.Length", "Sepal.Width"),cross.by="Species")
# Species N. MEAN.Sepal.Length MEAN.Sepal.Width SD.Sepal.Length
#1: setosa 50 5.0 3.4 0.35
#2: versicolor 50 5.9 2.8 0.52
#3: virginica 50 6.6 3.0 0.64
# …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用数据表库来实现更多自定义.
这是我想要做的例子. https://datatables.net/examples/api/row_details.html 请注意,我在不同的data.frame R变量中有详细信息.像这样
A= data.frame(Name = c("Airi Satou", "Angelica Ramos","Paul Byrd")
, Position = c("Accountant","Accountant", "CEO")
, Office = c("Tokyo", "Tokyo", "New York"))
A.detail= data.frame(Name = c("Airi Satou", "Angelica Ramos")
, Extension= c("5407c", "8422")
, salary = c(16000, 20000))
Run Code Online (Sandbox Code Playgroud)
我不喜欢合并两个data.frame变量,如果可以在没有合并的情况下这样做,因为计算时间.显然,有些行可能没有任何细节.
我可以在数据表中选择一行,并通过将其绑定为输入将行信息发送到R(感谢https://github.com/toXXIc/datatables.Selectable/)然后我可以从R中找到与所选行相关的详细信息第二个data.frame变量.但我不知道如何将此发送回html(在所选行下)显示.我已将第一个表绑定为shinyoutput所以我;我不确定是否可以传递另一个数据来再次更改此输出.
也许我应该在单击详细信息按钮时使用ajax来请求更多数据,但我不知道如何在闪亮的情况下执行ajax请求.
我想知道当我使用group by. 这是一个简化的示例:
dt = data.table(iris)
dt[,.(
# .N,
# sum_len = sum(Sepal.Length),
avg_len = sum(Sepal.Length)/.N,
var_len = sum(Sepal.Length^2)/.N - (sum(Sepal.Length)/.N)^2
),by= "Species"]
Run Code Online (Sandbox Code Playgroud)
在这里我要重复使用sum(Sepal.Length)和.N无需重新计算。
编辑:一个更完整的例子是我们也在使用.SD:
dt[,c(lapply(.SD, mean),lapply(.SD, var)),by="Species",.SDcols = c("Sepal.Length", "Sepal.Width")]
Run Code Online (Sandbox Code Playgroud)