我有5个项目,每个项目可以取值1或-1.我想生成一个由可能组合的行组成的矩阵.项目的顺序无关紧要,组合的顺序无关紧要.我知道我可以机械地做到这一点,但我认为有人必须知道生成这个矩阵的捷径.如果这与其他问题类似,我很抱歉,但我发现的解决方案都不能用我的编程技巧应用于这个特定问题.
我需要做两个数据帧的笛卡尔积.例如,
A = id weight type
10 20 a
10 30 b
25 10 c
B = date report
2007 y
2008 n
Run Code Online (Sandbox Code Playgroud)
然后C就像做了A和B的笛卡尔积之后
C = id weight type date report
10 20 a 2007 y
10 20 a 2008 n
10 30 b 2007 y
10 30 b 2008 n
25 10 c 2007 y
25 10 c 2008 n
Run Code Online (Sandbox Code Playgroud)
因为有些ID在A中是相同的,所以我不能使用类似的方式
C <- merge(A$id,B$date)
C <- merge(C,A,by="id")
C <- merge(C,B,by="date")
Run Code Online (Sandbox Code Playgroud)
这种方式会产生更多行.有人能帮助我离开这里吗?谢谢
我有一个大数据集和一个查找表。我需要为数据集中的每一行返回满足条件的查找中行的最小值。
鉴于我的数据集的大小,我不愿意通过交叉连接来破解一个不确定的解决方案,因为这会创建数百万条记录。我希望有人可以提出一个(理想情况下)利用 base r 或 data.table 的解决方案,因为它们已经以有效的方式使用。
例子
A<-seq(1e4,9e4,1e4)
B<-seq(0,1e4,1e3)
dt1<-data.table(expand.grid(A,B),ID=1:nrow(expand.grid(A,B)))
setnames(dt1, c("Var1","Var2"),c("A","B"))
lookup<-data.table(minA=c(1e4,1e4,2e4,2e4,5e4),
maxA=c(2e4,3e4,7e4,6e4,9e4),
minB=rep(2e3,5),
Val=seq(.1,.5,.1))
# Sample Desired Value
A B ID Val
99: 90000 10000 99 0.5
Run Code Online (Sandbox Code Playgroud)
在 SQL 中,我会写一些类似的东西
SELECT ID, A, B, min(Val) as Val
FROM dt1
LEFT JOIN lookup on dt1.A>=lookup.minA
and dt1.A<=lookup.maxA
and dt1.B>=lookup.minB
GROUP BY ID, A, B
Run Code Online (Sandbox Code Playgroud)
这将连接从lookupto 开始的所有匹配记录dt1并返回最小的Val.
更新
到目前为止,我的解决方案如下:
CJ.table<-function(X,Y) setkey(X[,c(k=1,.SD)],k)[Y[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
dt1.lookup<- CJ.table(dt1,lookup)[A>=minA & A<=maxA & B>=minB,
list(Val=Val[which.min( Val)]),
by=list(ID,A,B)]
dt1.lookup<-rbind.fill(dt1.lookup, dt1[!ID %in% …Run Code Online (Sandbox Code Playgroud)