相关疑难解决方法(0)

如何生成组合矩阵

我有5个项目,每个项目可以取值1或-1.我想生成一个由可能组合的行组成的矩阵.项目的顺序无关紧要,组合的顺序无关紧要.我知道我可以机械地做到这一点,但我认为有人必须知道生成这个矩阵的捷径.如果这与其他问题类似,我很抱歉,但我发现的解决方案都不能用我的编程技巧应用于这个特定问题.

r cross-join

19
推荐指数
3
解决办法
2万
查看次数

R:两个数据帧的笛卡尔积的任何函数?

我需要做两个数据帧的笛卡尔积.例如,

 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)

这种方式会产生更多行.有人能帮助我离开这里吗?谢谢

r cartesian dataframe

6
推荐指数
1
解决办法
2021
查看次数

R 使用 data.table 的多条件连接

我有一个大数据集和一个查找表。我需要为数据集中的每一行返回满足条件的查找中行的最小值。

鉴于我的数据集的大小,我不愿意通过交叉连接来破解一个不确定的解决方案,因为这会创建数百万条记录。我希望有人可以提出一个(理想情况下)利用 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)

r data.table

5
推荐指数
1
解决办法
2110
查看次数

标签 统计

r ×3

cartesian ×1

cross-join ×1

data.table ×1

dataframe ×1