我想创建一个长度为二进制向量的所有可能组合,以及行中n > 2最大数量为1s 的属性2.
例如:
如果n=4,答案是:
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
1 0 0 0
1 0 0 1
1 0 1 0
1 1 0 0
Run Code Online (Sandbox Code Playgroud)
这有效,但随着n变大(n> 20),内存非常密集且速度很慢:
n <- 4
m <- expand.grid(rep(list(0:1),n))
m <- m[rowSums(m)<3,]
Run Code Online (Sandbox Code Playgroud)
我怎样才能更有效地做到这一点?
答案:
*基于Marat Talipov和akrun解决方案的组合
n=4
z=rep(0,n)
rbind(unname(z), t(combn(0:n,2, FUN=function(k) {z[k]=1;z})))
Run Code Online (Sandbox Code Playgroud) 想象一下,我有一个向量x,我想创建一个矩阵,所有可能的n选择x的元素的2个组合.
更详细的,让我们说x是,
x = c(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
然后,所有可能的(4选2)= 6,
X = as.matrix(data.frame(col1 = c(1,1,1,2,2,3), col2 = c(2,3,4,3,4,4)))
Run Code Online (Sandbox Code Playgroud)
R中有功能吗?
我希望找到最快的方法来找到1000个'n'整数的可能组合来找到目标整数.
例如.说我想要数字'20'.我想找到最多1000个四个整数的组合,它们总和到这个数字.整数可以重复.我还有一个条件,即整数不能小于特定的数字,在这种情况下为4.
target<-20 #the number I wish to sum to
lowest<-4 #the smallest integer I allow
size<-4 #the number of integers I wish to use to sum
maxposs <- target - ((size-1) * lowest) #given the lowest, this is the max possible integer. In my example it is 8.
Run Code Online (Sandbox Code Playgroud)
这就是我开始解决这个问题的方法.利用combn找到的四个选择整数的所有组合,然后由那些和为我的目标过滤.
m <- combn(rep(lowest:maxposs,size), size)
m1<- m[,colSums(m)==target]
Run Code Online (Sandbox Code Playgroud)
这里,'m1'有245列.只有这么多解决方案.最后几列:
# [,238] [,239] [,240] [,241] [,242] [,243] [,244] [,245]
#[1,] 4 4 4 4 4 4 5 5
#[2,] 5 5 …Run Code Online (Sandbox Code Playgroud) 我曾经使用packagecombn()来查找两个日期/时间之间的重叠。但处理我正在处理的大型数据集太慢了。我正在尝试从包中使用,但无法让它工作。任何帮助,将不胜感激。如果您知道我应该查看的任何其他包/功能,也请告诉我。lubridatecombn()comboGeneral()RcppAlgos
get_overlap <- function(.data, .id, .start, .end) {
id <- .data[[.id]]
int <- interval(.data[[.start]], .data[[.end]])
names <- combn(id, 2, FUN = function(.) paste(., collapse = "-"))
setNames(combn(int, 2, function(.) intersect(.[1], .[2])), names)
}
get_overlap(dat, "id", "start", "end")
# a-b a-c a-d a-e b-c b-d b-e c-d c-e d-e
# 49 1 4 17 23 14 18 NA 2 NA
Run Code Online (Sandbox Code Playgroud)
这是我使用失败的尝试comboGeneral()。
comboGeneral(dat$int, 2, FUN = function(.) intersect(.[1], .[2]))
# Output: …Run Code Online (Sandbox Code Playgroud) 我想创建一个由固定数字0和1组成的二进制向量的所有可能组合.例如:dim(v)= 5x1; N1 = 3; N0 = 2; 在这种情况下,我希望有类似的东西:
1,1,1,0,0
1,1,0,1,0
1,1,0,0,1
1,0,1,1,0
1,0,1,0,1
1,0,0,1,1
0,1,1,1,0
0,1,1,0,1
0,1,0,1,1
0,0,1,1,1
Run Code Online (Sandbox Code Playgroud)
我找到了一些帮助阅读这篇文章 创建所有可能的0,1或2"1"的长度为n的二进制向量 的组合,但我想只生成我需要的组合,避免任何浪费空间(我认为问题会随着n)而呈指数增长
假设我有一个c(1, 2, 3, 4)没有重复值的向量.我需要一个向量c(1 * 2, 1 * 3, 1 * 4, 2 * 3, 2 * 4, 3 * 4),所以乘法是在这个向量值的所有可能组合中完成的.有没有办法做到这一点?提前致谢!
我有这个数据...
Scientificname Level Zone levelmean
<chr> <int> <chr> <dbl>
1 Acanthostracion polygonius 3 B 0.135
2 Acanthostracion quadricornis 1 B 0.286
3 Acanthostracion quadricornis 1 D 0.228
4 Acanthostracion quadricornis 2 B 0.212
5 Acanthostracion quadricornis 2 D 0.181
6 Acanthostracion quadricornis 3 B 0.247
7 Acanthostracion quadricornis 3 D 0.222
8 Acanthostracion quadricornis 4 B 0.151
9 Acanthostracion quadricornis 4 D 0.202
10 Acanthostracion spp. 2 B 0.225
11 Achirus lineatus 1 B 0.204
12 Achirus lineatus 1 D …Run Code Online (Sandbox Code Playgroud) 我是新手R程序员.我有以下一系列要点.
df <- data.frame(x = c(1 , 2, 3, 4), y = c(6 , 3, 7, 5))
df <- df %>% mutate(k = 1)
df <- df %>% full_join(df, by = 'k')
df <- subset(df, select = c('x.x', 'y.x', 'x.y', 'y.y'))
df
Run Code Online (Sandbox Code Playgroud)
有没有办法选择"独特"点?(点的顺序无关紧要)
编辑:
x.x y.x x.y y.y
1 6 2 3
2 3 3 7
.
.
.
Run Code Online (Sandbox Code Playgroud)
(我改变了2到7来澄清问题)
如果标题不能准确描述我正在做的事,请道歉.
我正在努力为幻想体育比赛建立每一个可能的假设团队.这意味着将所有可用的球员组合在一起,每个球员都有自己所在球队的特征,他们的位置和工资,这限制了一支球队的人数.我遇到的麻烦是找到一种内存有效的方法将它们全部组合起来.
我做了一个示例数据集:
player_pool <- data.frame(id = seq(1,30), salary = seq(1,30), team = rep(LETTERS[seq(from=1, to=5)],6), position = rep(LETTERS[seq(from=1, to=5)],6))
Run Code Online (Sandbox Code Playgroud)
在这30名球员中,我想选择每支球队8人,其中至少有1名来自5个角色的球员,不超过3名来自同一球队的球员,总薪水不超过50.
例如,这将是一个有效的团队:
id salary team position
1 1 A A
2 2 B B
3 3 C C
4 4 D D
5 5 E E
6 6 A A
7 7 B B
8 8 C C
Run Code Online (Sandbox Code Playgroud)
每支球队不超过两名球员,每名球员至少1名,总薪水为36名.
我一直在尝试使用包来逐步实现所有~6MM组合的公式iterpc,查找并计算每一步的薪水/团队编号.这让我可以在每一步都将所有内容都安装到内存中,但速度非常慢且效率低下 - 这相当于创建了每个可能的团队并连续应用规则.
任何替代方法都会很棒!
我想有效地找到列表的所有组合,不包括每个元素与其自身的组合.例如,使用A,B,C,D列表查找除AA,BB,CC,DD之外的所有组合.
我可以使用这段代码看起来效率低下:
x <- c("A","B","C","D")
dt <- CJ(x,x)
dt <- dt[!V1==V2]
Run Code Online (Sandbox Code Playgroud)
问题是第三行的运行时间大约是第二行的4倍.因此,对于像我的真实数据这样的大型列表,第2行和第3行可能需要很长时间.
我在Windows 7上使用data.table 1.9.6,R 3.2.2和R Studio.
非常感谢.
我有一个像这样的data.table:
dt<-data.table(group=(c(rep("A", 4), rep("B", 3), rep("C", 2))),
individual=c("Ava", "Bill", "Claire", "Daniel", "Evelyn", "Francis", "Grant", "Helen", "Ig"))
Run Code Online (Sandbox Code Playgroud)
我想改变这样的事情:
dt2<-data.table(group=(c(rep("A", 6), rep("B", 3), rep("C", 1))), edge1=c("Ava", "Ava", "Ava", "Bill", "Bill", "Claire", "Evelyn", "Evelyn", "Francis", "Helen"), edge2=c("Bill", "Claire", "Daniel", "Claire", "Daniel", "Daniel", "Francis", "Grant", "Grant", "Ig"))
Run Code Online (Sandbox Code Playgroud)
基本上,第二个表的每一行在第一个表中采用"按组分组的两个人".整个想法是将数据输入igraph进行网络分析.如果有更好的解决方案用于此目的,我们非常欢迎.
r ×11
combinations ×4
data.table ×2
binary ×1
combn ×1
dataframe ×1
dplyr ×1
grouping ×1
igraph ×1
lubridate ×1
performance ×1
simulation ×1
vector ×1