Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于plyr的计数频率_R_Count_Combinations_Frequency - Fatal编程技术网

基于plyr的计数频率

基于plyr的计数频率,r,count,combinations,frequency,R,Count,Combinations,Frequency,我试图使用R中库plyr中的count函数来计算出现的特定数字组合的频率 例如,我想知道数字1和2一起出现的频率 N1 N2 N3 1 1 2 5 2 2 1 4 3 2 4 3 4 3 1 2 5 2 3 1 6 3 1 4 因此,对于像上面这样的数据帧,我必须组合第1列和第2列、第1列和第3列、第2列和第3列,并合并所有这些数据帧。然后我对合并的数据帧进行“计数” combined1_2 = cbind(df$N1,d

我试图使用R中库
plyr
中的
count
函数来计算出现的特定数字组合的频率

例如,我想知道数字1和2一起出现的频率

   N1 N2 N3 
1   1  2  5
2   2  1  4    
3   2  4  3
4   3  1  2    
5   2  3  1
6   3  1  4
因此,对于像上面这样的数据帧,我必须组合第1列和第2列、第1列和第3列、第2列和第3列,并合并所有这些数据帧。然后我对合并的数据帧进行“计数”

combined1_2 = cbind(df$N1,df$N2)
combined1_3 = cbind(df$N1,df$N3)
combined2_3 = cbind(df$N2,df$N3)

combined_all = rbind(freq1_2,freq1_3,freq2_3)
combined_freq = count(combined_all)
所以当我检查频率表时,我得到了以下结果(只显示了部分结果)

问题是计数函数处理的数字“1和2”与“2和1”不同。所以我想知道R中是否有任何函数可以解决这个问题,并产生如下所示的正确结果

  x1 x2  Freq
1  1  2     4

您只需数一数这些数字连成一行的时间:

sum(apply(df, 1, function(x){all(c(1, 2) %in% x)}))
#[1] 4

您只需数一数这些数字连成一行的时间:

sum(apply(df, 1, function(x){all(c(1, 2) %in% x)}))
#[1] 4

如果没有太多的数字需要检查,也可以通过检查
df
是否等于每个数字来将其矢量化

sum((rowSums(df == 1) > 0) & (rowSums(df == 2) > 0))
## [1] 4

如果没有太多的数字需要检查,也可以通过检查
df
是否等于每个数字来将其矢量化

sum((rowSums(df == 1) > 0) & (rowSums(df == 2) > 0))
## [1] 4

谢谢你的帮助。这确实简化了过程。另外一个问题:对于更大的数据,我想如果我想在例如40个不同的数字中找到组合频率,我将不得不使用循环。如果你有40个不同的数字,使用Caths方法,这将是简单的谢谢你的帮助。这确实简化了过程。另外一个问题:对于更大的数据,我想如果我想在40个不同的数字之间找到组合频率,我必须使用循环。如果你有40个不同的数字,使用Caths方法,这将是简单的解决方案!它省去了合并每个列的过程。我想知道是否有一种简单的方法可以写出1和40之间任意两个数字的所有组合。或者,使用循环是将c(1,2)部分替换为c(i,i+n)的唯一解决方案吗?@1STCLASSCLOME:-)。对于您的第二个问题,可以使用
combn
?谢谢您的解决方案!它省去了合并每个列的过程。我想知道是否有一种简单的方法可以写出1和40之间任意两个数字的所有组合。或者,使用循环是将c(1,2)部分替换为c(i,i+n)的唯一解决方案吗?@1STCLASSCLOME:-)。第二个问题可以使用
combn