在 R 中,如何创建显示公共变量的倒数表?

In R, how do I create reciprocal tables showing common variables?

我有一个用于作物品种试验的数据框,可以显示在任何给定地点和年份是否存在品种。以下示例是数据的子集。

example<-structure(list(Variety = 1:88, Site1_Yr1 = c(0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 1L), 
Site2_Yr1 = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L
), 
Site3_Yr1 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
Site1_Yr2 = c(0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L), 
Site2_Yr2 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 
0L, 0L, 1L), 
Site3_Yr2 = c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), 
.Names = c("Variety", "Site1_Yr1", "Site2_Yr1", "Site3_Yr1", "Site1_Yr2",   "Site2_Yr2", "Site3_Yr2"), class = "data.frame", row.names = c(NA, -88L))

我想总结数据框以生成倒数 table,显示位置和年份组合之间共有多少品种。汇总数据类似于以下内容。显示不同品种的数量以及常见品种的百分比也很有用。

result <- structure(list(X = structure(c(1L, 3L, 5L, 2L, 4L, 6L), 
.Label = c("Site1_Yr1", 
"Site1_Yr2", "Site2_Yr1", "Site2_Yr2", "Site3_Yr1", "Site3_Yr2"),
class = "factor"), Site1_Yr1 = c(5L, 4L, 0L, 2L, 1L, 1L),
Site2_Yr1 = c(4L, 11L, 4L, 5L, 1L, 1L),
Site3_Yr1 = c(0L, 4L, 9L, 4L, 0L, 1L),
Site1_Yr2 = c(2L, 5L, 4L, 10L, 1L, 1L),
Site2_Yr2 = c(1L, 1L, 0L, 1L, 6L, 1L), 
Site3_Yr2 = c(1L, 1L, 1L, 1L, 1L, 13L)),
.Names = c("X", "Site1_Yr1", "Site2_Yr1", "Site3_Yr1", "Site1_Yr2", "Site2_Yr2", "Site3_Yr2"), 
class = "data.frame", row.names = c(NA, -6L))

如有任何建议,我们将不胜感激!

更新: 我将 lmo 友情提供的脚本版本应用于实际数据集。

example2<- structure(list(Davis.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), Davis.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L,   
0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), Davis.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), DREC.1 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), DREC.2 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), DREC.3 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 3L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE1.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 
0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE1.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE1.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE2.1 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE2.2 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE2.3 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 3L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), WSREC.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 
0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), WSREC.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,   
3L, 3L, 3L, 3L), WSREC.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L)), .Names = c("Davis.1", 
"Davis.2", "Davis.3", "DREC.1", "DREC.2", "DREC.3", "KARE1.1", 
"KARE1.2", "KARE1.3", "KARE2.1", "KARE2.2", "KARE2.3", "WSREC.1", 
"WSREC.2", "WSREC.3"), row.names = c("83G19", "84G62", "85G01", 
"85G03", "86G32", "87P06", "AG1201", "AG1401", "AG2101", "AG2103", 
"AG3101", "DK28E", "DKS-51-01", "DKS-551-0", "DKS-551-01", "DKS-553-6", 
"DKS-553-67", "DKS26-60", "DKS28-05", "DKS37-07", "DKS44-20", 
"DKS51-01", "DKS53-67", "ExP28133", "EXP28133", "KS310", "KS585", 
"NK5418", "NK7829", "NK8416", "R-0413", "R-06173", "R-10413", 
"R-49473", "R-68653", "R-92123", "SP3425"), class = "data.frame")

获取站点-年份对的名称:

sitePairs <- t(combn(1:15, 2, FUN=function(i) names(example2[,i])))

同品种数:

varietyCount <- combn(1:15, 2, FUN=function(i) sum((rowSums(example2[,i])==2)))

这 returns 全为零,而实际上在大多数情况下有超过 80% 的匹配值。显然我误解了脚本在做什么???

这是一种使用 combn 的解决方案:

# get names of site-year pairs
 sitePairs <- t(combn(2:7, 2, FUN=function(i) names(example[,i])))

# count the same varieties
varietyCount <- combn(2:7, 2, FUN=function(i) sum((rowSums(example[,i])==2)))

# put in a data.frame
data.frame("site1"= sitePairs[,1], "site2"= sitePairs[,2], "varietyCount"= varietyCount,
           stringsAsFactors=FALSE)

这里的comb函数产生了所有的成对比较。我首先使用它来获取站点名称。在计算中,来自 combn 的成对组合被馈送到一个函数,该函数使用这些对将数据子集化到正确的列,然后检查两个站点年份是否都在产生品种(使用 RowSums(...) == 2) .然后将该逻辑向量强制为 1 和 0 并求和。

由于示例 2 由 0 和 3 组成,只需将 RowSums(...) == 2 更改为 RowSums(...) == 6 即可获得所需的计数。