数据来自我正在玩的另一个问题:
dt <- data.table(user=c(rep(3, 5), rep(4, 5)),
country=c(rep(1,4),rep(2,6)),
event=1:10, key="user")
# user country event
#1: 3 1 1
#2: 3 1 2
#3: 3 1 3
#4: 3 1 4
#5: 3 2 5
#6: 4 2 6
#7: 4 2 7
#8: 4 2 8
#9: 4 2 9
#10: 4 2 10
Run Code Online (Sandbox Code Playgroud)
这是令人惊讶的行为:
dt[user == 3, as.data.frame(table(country))]
# country Freq
#1 1 4
#2 2 1
dt[user == 4, as.data.frame(table(country))]
# country Freq
#1 2 5
dt[, as.data.frame(table(country)), …Run Code Online (Sandbox Code Playgroud) 我是R的新手,所以在C和Python中似乎工作正常,令人惊讶地在R中分解.我正在尝试计算前1000个Fibonacci数的乘积.这是完整的代码:
#PRRODUCT OF FIBONACCI NUMBERS
Fibonacci<-rep(0, 1000)
Fibonacci[0]<-1
Fibonacci[1]<-1
Product<-1
for (i in 2:1000)
{
Fibonacci[i]<-(Fibonacci[i-1])+(Fibonacci[i-2])
Product<-Fibonacci[i]*Product
}
Fibonacci[1000]
Product
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误:
Error in Fibonacci[i] <- (Fibonacci[X - 1]) + (Fibonacci[X - 2]) :
replacement has length zero
Run Code Online (Sandbox Code Playgroud)
我倾向于认为我误解了使用数组的不同元素进行操作(可能是矢量描述中的i-2不正确),但我在过去的一个半小时内没有找到任何可以帮助我纠正的东西它.因此,任何对问题原因的见解都将受到最高的赞赏.
先感谢您.
使用data.table我可以执行以下操作:
library(data.table)
dt = data.table(a = 1:2, b = c(1,2,NA,NA))
# a b
#1: 1 1
#2: 2 2
#3: 1 NA
#4: 2 NA
dt[, b := b[1], by = a]
# a b
#1: 1 1
#2: 2 2
#3: 1 1
#4: 2 2
Run Code Online (Sandbox Code Playgroud)
dplyr然而,尝试相同的操作,数据被加扰/排序a:
library(dplyr)
dt = data.table(a = 1:2, b = c(1,2,NA,NA))
dt %.% group_by(a) %.% mutate(b = b[1])
# a b
#1 1 1
#2 1 1
#3 2 …Run Code Online (Sandbox Code Playgroud) 我有以下数据:
library(data.table)
d = data.table(a = c(1:3), b = c(2:4))
Run Code Online (Sandbox Code Playgroud)
并希望获得此结果(以适用于任意数量的列的方式):
d[, c := paste0('a_', a, '_b_', b)]
d
# a b c
#1: 1 2 a_1_b_2
#2: 2 3 a_2_b_3
#3: 3 4 a_3_b_4
Run Code Online (Sandbox Code Playgroud)
以下作品,但我希望能找到更短更清晰的东西.
d = data.table(a = c(1:3), b = c(2:4))
d[, c := apply(mapply(paste, names(.SD), .SD, MoreArgs = list(sep = "_")),
1, paste, collapse = "_")]
Run Code Online (Sandbox Code Playgroud) 对于向量或时间列表,我想从字符串时间开始,例如12:34:56.789从午夜到毫秒,这将等于45296789.
这就是我现在所做的:
toms = function(time) {
sapply(strsplit(time, ':', fixed = T),
function(x) sum(as.numeric(x)*c(3600000,60000,1000)))
}
Run Code Online (Sandbox Code Playgroud)
并希望更快地完成.
以下是基准测试的示例数据集:
times = rep('12:34:56.789', 1e6)
system.time(toms(times))
# user system elapsed
# 9.00 0.04 9.05
Run Code Online (Sandbox Code Playgroud) 这是一个简单的例子来说明这个问题:
library(data.table)
dt = data.table(a = c(1,1,2,2), b = 1:2)
dt[, c := cumsum(a), by = b][, d := cumsum(a), by = c]
# a b c d
#1: 1 1 1 1
#2: 1 2 1 2
#3: 2 1 3 2
#4: 2 2 3 4
Run Code Online (Sandbox Code Playgroud)
试图在dplyr我做同样的事情失败,因为第一个group_by是持久的,分组是由两个b和c:
df = data.frame(a = c(1,1,2,2), b = 1:2)
df %.% group_by(b) %.% mutate(c = cumsum(a)) %.%
group_by(c) %.% mutate(d = cumsum(a))
# a …Run Code Online (Sandbox Code Playgroud) 假设我有数据表dt.
dt = as.data.table(c(0,1,2,3))
Run Code Online (Sandbox Code Playgroud)
我想知道为什么dt的行为在以下两行代码中有所不同.
dt[,V1]
dt[,"V1",with=F]
Run Code Online (Sandbox Code Playgroud)
具体来说,第一行产生数字向量,而第二行产生data.table.
我想构建一个函数,允许我通过传递一个字符串(因此使用= F)动态检索单个列,并在某些其他函数中使用该输出.就像现在一样,后一种情况下的行为可能会导致某些函数出错,例如ecdf和hist,它们不接受data.frame或data.table.
这是我做过的解决方法.
as.data.frame(dt[,"V1",with=F])[,1]
Run Code Online (Sandbox Code Playgroud)
这将返回预期的输出:一个与ecdf和hist很好地匹配的向量.这有点乱.这种行为有什么dt[,"V1",with=F]不同dt[,V1]?
我想在C/C++中复制以下R函数:
fn1 = function(a, b) eval(a, b)
fn1(substitute(a*2), list(a = 1))
#[1] 2
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试导致错误(有时在崩溃中),可能是因为我没有从列表对象获取环境(我查看了R源代码,并且它使用了一堆内部函数)我不认为我可以使用的点,我认为这是Rf_eval想要的而不是对象本身.
require(Rcpp)
require(inline)
fn2 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
'return Rf_eval(x, y);')
fn2(substitute(a*2), list(a = 1))
# error, object 'a' not found
Run Code Online (Sandbox Code Playgroud)
另一种尝试是尝试调用基数R eval,这也给出了同样的错误:
require(Rcpp)
require(inline)
fn3 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
'Function base_eval("eval"); return base_eval(x, y);',
plugin = 'Rcpp')
fn3(substitute(a*2), list(a = 1))
# again, object 'a' not found
Run Code Online (Sandbox Code Playgroud)
每种方法都缺少什么,我怎样才能使它们都有效?
考虑以下:
DT = data.table(a=sample(1:2), b=sample(1:1000,20))
如何显示b,比如每个a 显示n个最高值?
我被困在了DT[,b,by=a][order(a,-b)].
谢谢!
我想删除基于"用户"列的重复项,但只删除它出现的第一个实例.
DF:
User No
A 1
B 1
A 2
A 3
A 4
C 1
B 2
D 1
Run Code Online (Sandbox Code Playgroud)
结果:(A1和B1删除)
User No
A 2
A 3
A 4
C 1
B 2
D 1
Run Code Online (Sandbox Code Playgroud)
我使用复制功能一直没有成功.
任何帮助,将不胜感激!谢谢!