Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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
R:用于数据帧列表上的循环,以输出因子级别的每个组合之间的匹配矩阵_R_Matrix - Fatal编程技术网

R:用于数据帧列表上的循环,以输出因子级别的每个组合之间的匹配矩阵

R:用于数据帧列表上的循环,以输出因子级别的每个组合之间的匹配矩阵,r,matrix,R,Matrix,我有这样一个数据帧: region plot species 1 1A A_B 1 1B B_C 1 1C A_B 1 1D C_D 2 2A B_C 2 2A E_F 2 2B B_C 2 2B E_F 2 2

我有这样一个数据帧:

region     plot    species
 1          1A      A_B  
 1          1B      B_C
 1          1C      A_B
 1          1D      C_D
 2          2A      B_C
 2          2A      E_F
 2          2B      B_C
 2          2B      E_F     
 2          2C      E_F
 2          2D      B_C
 3          3A      A_B
 3          3B      A_B        
此数据帧可用于数千行,因此我想使用一个循环来: 1) 按区域对数据进行子集划分 2) 然后为所有图的两两比较创建矩阵 在每个子集区域内

在这种情况下,矩阵的i和j维是区域内的绘图ID,矩阵填充包括共享物种组合的计数。矩阵中未填充的一半将填充NAs。这些矩阵将被放入一个列表中。对于本例,结果将是:

resultslist<-
[[1]]      1A   1B    1C    1D    

         1A NA   NA   NA   NA   NA

         1B 0   NA    NA   NA   NA

         1C 1   0    NA    NA   NA

         1D 0   0    0    NA    NA

 [[2]]       2A   2B    2C    2D    

         2A NA   NA   NA   NA   NA

         2B 2   NA    NA   NA   NA

         2C 1   1    NA    NA   NA

         2D 1   1    0    NA    NA


[[3]]      3A   3B       

         3A NA   NA   

         3B 1   NA   

resultslist我继续编写您的代码,并得出以下结论:

数据:

data=read.table(text="region     plot    species
1          1A      A_B  
1          1B      B_C
1          1C      A_B
1          1D      C_D
2          2A      B_C
2          2A      E_F
2          2B      B_C
2          2B      E_F     
2          2C      E_F
2          2D      B_C
3          3A      A_B
3          3B      A_B",stringsAsFactors=F,h=T)       
sublist=NA
for (i in unique(data$region)){   
  sublist[i]<-list(subset(data, data[,1] == i))  
  print(i)
}

results = list()
for (r in unique(data$region)){
  myset<-split(sublist[[r]][[3]],sublist[[r]][[2]])
  output<- matrix(NA, nrow = length(myset), ncol = length(myset))
  rownames(output)<-colnames(output)<-unique(sublist[[r]][[2]])
  for (j in 1:(length(myset)-1)){
    for (i in (j+1):length(myset)){
       output[i,j]=sum(myset[[j]] %in% myset[[i]])
    }
  }
results[[r]]=output
}
[[1]]
   1A 1B 1C 1D
1A NA NA NA NA
1B  0 NA NA NA
1C  1  0 NA NA
1D  0  0  0 NA

[[2]]
   2A 2B 2C 2D
2A NA NA NA NA
2B  2 NA NA NA
2C  1  1 NA NA
2D  1  1  0 NA

[[3]]
   3A 3B
3A NA NA
3B  1 NA
代码:

data=read.table(text="region     plot    species
1          1A      A_B  
1          1B      B_C
1          1C      A_B
1          1D      C_D
2          2A      B_C
2          2A      E_F
2          2B      B_C
2          2B      E_F     
2          2C      E_F
2          2D      B_C
3          3A      A_B
3          3B      A_B",stringsAsFactors=F,h=T)       
sublist=NA
for (i in unique(data$region)){   
  sublist[i]<-list(subset(data, data[,1] == i))  
  print(i)
}

results = list()
for (r in unique(data$region)){
  myset<-split(sublist[[r]][[3]],sublist[[r]][[2]])
  output<- matrix(NA, nrow = length(myset), ncol = length(myset))
  rownames(output)<-colnames(output)<-unique(sublist[[r]][[2]])
  for (j in 1:(length(myset)-1)){
    for (i in (j+1):length(myset)){
       output[i,j]=sum(myset[[j]] %in% myset[[i]])
    }
  }
results[[r]]=output
}
[[1]]
   1A 1B 1C 1D
1A NA NA NA NA
1B  0 NA NA NA
1C  1  0 NA NA
1D  0  0  0 NA

[[2]]
   2A 2B 2C 2D
2A NA NA NA NA
2B  2 NA NA NA
2C  1  1 NA NA
2D  1  1  0 NA

[[3]]
   3A 3B
3A NA NA
3B  1 NA

非常感谢您抽出时间。当我使用我提供给您的示例数据时,这段代码非常有效。然而,当在实际数据上使用它时,我得到了以下错误:
rownamesHm中的错误,如果不看到数据就很难判断。您可以尝试将定义行名的行更改为:
rownames(输出)并感谢您的更正,我已经编辑了行号,感谢您在这里帮助我。
rownames(输出)我想我可能已经缩小了可能的错误源…我使用的数据帧有一些实例,其中特定区域只有一个与之关联的绘图(例如,区域5只有绘图5A)。因此,成对矩阵仅包括图5A与图5A的成对比较。这可能是错误的根源吗?在这种情况下,是否需要在循环中包含if-else语句?