我需要找到行数最小的(+60)
相对较大data.frame(~250,000 x 3)(或者我可以等效地工作xts).
set.seed(1000)
my.df <- sample(1:5, 250000*3, replace=TRUE)
dim(my.df) <- c(250000,3)
my.df <- as.data.frame(my.df)
names(my.df) <- c("A", "B", "C")
Run Code Online (Sandbox Code Playgroud)
数据框my.df看起来像这样
> head(my.df)
A B C
1 2 5 2
2 4 5 5
3 1 5 3
4 4 4 3
5 3 5 5
6 1 5 3
Run Code Online (Sandbox Code Playgroud)
我试过了
require(data.table)
my.dt <- as.data.table(my.df)
my.dt[, row.min:=0] # without this: "Attempt to add new column(s) and set subset of rows at the same …Run Code Online (Sandbox Code Playgroud) 假设我想逐行计算几列范围的大小。
set.seed(1)
dat <- data.frame(x=sample(1:1000,1000),
y=sample(1:1000,1000),
z=sample(1:1000,1000))
Run Code Online (Sandbox Code Playgroud)
使用 data.frame(),我会做这样的事情:
dat$diff_range <- apply(dat,1,function(x) diff(range(x)))
Run Code Online (Sandbox Code Playgroud)
更简单地说,我正在寻找这个操作,在每一行上:
diff(range(dat[1,]) # for i 1:nrow(dat)
Run Code Online (Sandbox Code Playgroud)
如果我对整个表都这样做,它会是这样的:
setDT(dat)[,diff_range := apply(dat,1,function(x) diff(range(x)))]
Run Code Online (Sandbox Code Playgroud)
但是我将如何仅对命名(或编号)行执行此操作?
我有一个相当大的data.table(15M行,15列),我想要计算每行的中位数.我可以这样做
apply(DT, 1, median) # DT is my data.table
Run Code Online (Sandbox Code Playgroud)
但这很慢.是否有更快,更适合数据的替代方案?
作为一个小工作的例子,如果我有
DT = data.table(a = c(1, 2, 4), b = c(6, 4, 7),
c = c(3, 9, 9), d = c(18, 1, -5))
# a b c d
# 1: 1 6 3 18
# 2: 2 4 9 1
# 3: 4 7 9 -5
Run Code Online (Sandbox Code Playgroud)
计算行中位数的最有效方法是什么?
apply(DT, 1, median)
# [1] 4.5 3.0 5.5
Run Code Online (Sandbox Code Playgroud) DT <- data.table(A = 1:5, B = 2:6, C = 3:7)
Run Code Online (Sandbox Code Playgroud)
我想使用列索引对3列进行求和:
DT[, D := do.call(sum, .SD), .SDcols = 1:3]
Run Code Online (Sandbox Code Playgroud)
但是上面的代码不起作用,
我也不想用 DT[, D := (A+B+C)]