我的目标是要总结在与前缀开头列所有值skill_中data.table.我更喜欢使用解决方案,data.table但我并不挑剔.
我的解决方案到目前为止:
> require(data.table)
> DT <- data.table(x=1:4, skill_a=c(0,1,0,0), skill_b=c(0,1,1,0), skill_c=c(0,1,1,1))
> DT[, row_idx := 1:nrow(DT)]
> DT[, count_skills :=
sapply(1:nrow(DT),
function(id) sum(DT[row_idx == id,
grepl("skill_", names(DT)), with=FALSE]))]
> DT
x skill_a skill_b skill_c row_idx count_skills
1: 1 0 0 0 1 0
2: 2 1 1 1 2 3
3: 3 0 1 1 3 2
4: 4 0 0 1 4 1
Run Code Online (Sandbox Code Playgroud)
但是当DT非常大时,这变得非常慢.有没有更有效的方法来做到这一点?
我试图预测包含NAs的数据的拟合值,并基于生成的模型plm.这是一些示例代码:
require(plm)
test.data <- data.frame(id=c(1,1,2,2,3), time=c(1,2,1,2,1),
y=c(1,3,5,10,8), x=c(1, NA, 3,4,5))
model <- plm(y ~ x, data=test.data, index=c("id", "time"),
model="pooling", na.action=na.exclude)
yhat <- predict(model, test.data, na.action=na.pass)
test.data$yhat <- yhat
Run Code Online (Sandbox Code Playgroud)
当我运行最后一行时,我收到一条错误,指出替换有4行而数据有5行.
我不知道如何获得预测返回长度为5的向量...
如果不是运行plm我运行lm(如下面的行),我得到预期的结果.
model <- lm(y ~ x, data=test.data, na.action=na.exclude)
Run Code Online (Sandbox Code Playgroud) 我希望能够在组织缓冲区中的一大块代码中逐行执行代码.我的目标是逐行执行代码,而不必一次在块中运行所有代码(Cc Cc),而无需切换到特殊缓冲区(Cc').我使用R,但它可以应用于任何其他语言.有没有办法做到这一点?
示例:仅执行以下代码块中的第一行,以便变量a在会话中获得值7.
#+BEGIN_SRC R :session
a <- 3 + 4
a <- 5 + 6
#+END_SRC
Run Code Online (Sandbox Code Playgroud) 我data.table[...]在使用时评估内部变量时遇到了麻烦knitr.我已经看到这个问题的答案说它已经解决了,但我仍然遇到错误.我data.table在R 3.0.0上使用的是1.8.8版.
我正在使用ESS 13.05附带的Emacs 24.3.这是一个示例.Rnw文件:
\documentclass{article}
\begin{document}
<<init,eval=TRUE, cache=FALSE>>=
require(data.table)
dt <- data.table(x=1:10, y=11:20)
dt
dt[x > 5]
@
\end{document}
Run Code Online (Sandbox Code Playgroud)
和相应的(pdf)输出:
require(data.table)
## Loading required package: data.table
## data.table 1.8.8 For help type: help("data.table")
dt <- data.table(x = 1:10, y = 11:20)
dt
## x y
## 1: 1 11
## 2: 2 12
## 3: 3 13
## 4: 4 14
## 5: 5 15
## 6: 6 16
## 7: 7 17 …Run Code Online (Sandbox Code Playgroud) 将三个(或更多)data.tables与rbind合并时发出错误,并且两个非空data.tables之间存在空data.table:
> require(data.table)
Loading required package: data.table
data.table 1.9.2 For help type: help("data.table")
> DT <- data.table(x=c(1,2,3))
> rbind(DT, data.table(), DT)
Error in setcolorder(tt, chmatch(match.names, make.names(original.names[[x]], (from <text>#1) :
Column numbers in neworder out of bounds: NA
Run Code Online (Sandbox Code Playgroud)
如果空data.table最终会发生这种情况:
> rbind(DT, DT, data.table())
x
1: 1
2: 2
3: 3
4: 1
5: 2
6: 3
Run Code Online (Sandbox Code Playgroud)
但是当空的data.table在开头时会发生一些其他错误:
> rbind(data.table(), DT, DT)
Error in data.table::.rbind.data.table(...) (from <text>#1) :
Some colnames of argument 2 (x) are not present in colnames of item 1. …Run Code Online (Sandbox Code Playgroud) 我想在data.table中调用一个函数来计算一组汇总统计信息,如下所示:
summ.stats <- function(vec) {
list(
Min = min(vec),
Mean = mean(vec),
S.D. = sd(vec),
Median = median(vec),
Max = max(vec))
}
Run Code Online (Sandbox Code Playgroud)
我想把它j称为data.table:
DT <- data.table(a=c(1,2,3,1,2,3),b=c(1,4,3,2,1,4),c=c(2,3,4,5,2,1))
DT[, summ.stats(b), by=a]
Run Code Online (Sandbox Code Playgroud)
这很好,我得到:
a Min Mean S.D. Median Max
1: 1 1 1.5 0.7071068 1.5 2
2: 2 1 2.5 2.1213203 2.5 4
3: 3 3 3.5 0.7071068 3.5 4
Run Code Online (Sandbox Code Playgroud)
但我有兴趣将多个变量传递给summ.stats.例如:
DT[, summ.stats(b, c), by=a]
Run Code Online (Sandbox Code Playgroud)
我希望得到类似的东西:
a Var Min Mean S.D. Median Max
1: 1 b 1 1.5 0.7071068 …Run Code Online (Sandbox Code Playgroud) r ×5
data.table ×4
emacs ×1
ess ×1
knitr ×1
na ×1
org-babel ×1
org-mode ×1
panel-data ×1
plm ×1
predict ×1
rbind ×1
statistics ×1