【问题标题】:R: comparing data and counting, but "level sets of factors are different" errorR:比较数据和计数,但“因子的水平集不同”错误
【发布时间】:2017-12-24 23:20:38
【问题描述】:

我想比较两个数据框,但 R 显示“因子的水平集不同”错误。

这是数据框 A

structure(list(V1 = c(101.21, 101.29, 101.3, 101.9, 102.21, 102.29, 
102.31, 102.39, 102.9, 103.1, 103.91, 103.92, 104.1, 104.2, 105.11, 
105.12, 105.13, 105.14, 105.15, 105.94, 105.99, 106.11, 106.12, 
106.13, 106.14, 106.19, 106.2, 106.31, 106.32, 106.33, 106.39, 
106.41, 106.49, 106.9, 201.1, 201.2, 201.3, 202.1, 202.2, 202.3, 
203.11, 203.12, 203.19, 203.21, 203.22, 203.29, 204.1, 204.21, 
204.22, 204.23), V2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("CC", 
"CC or CTH+RVC<=50", "CC or CTSH+RVC<=50", "CC or RVC<=50", "CC+ECTC", 
"CC+ECTC or CTH+ECTC+RVC<=50", "CC+ECTC+TECH", "CC+RVC<=50", 
"CTh", "CTH", "CTH or CTH+RVC<=50", "CTH or CTSH+RVC<=50", "CTH or RVC<=50", 
"CTH+ECTC", "CTH+ECTC or CTH+RVC<=50", "CTH+ECTC or CTSH+RVC<=50", 
"CTH+ECTC or RVC<=50", "CTH+ECTC+RVC<=50", "CTH+RVC<=50", "CTSH", 
"CTSH or RVC<=50", "CTSH+ECTC", "CTSH+ECTC+RVC<=50", "CTSH+RVC<=50", 
"RVC<=50", "RVC>50"), class = "factor")), .Names = c("V1", "V2"
), row.names = c(NA, 50L), class = "data.frame")

这是数据框 B

structure(list(V1 = c(101.21, 101.29, 101.3, 101.9, 102.21, 102.29, 
102.31, 102.39, 102.9, 103.1, 103.91, 103.92, 104.1, 104.2, 105.11, 
105.12, 105.13, 105.14, 105.15, 105.94, 105.99, 106.11, 106.12, 
106.13, 106.14, 106.19, 106.2, 106.31, 106.32, 106.33, 106.39, 
106.41, 106.49, 106.9, 201.1, 201.2, 201.3, 202.1, 202.2, 202.3, 
203.11, 203.12, 203.19, 203.21, 203.22, 203.29, 204.1, 204.21, 
204.22, 204.23), V2 = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("", "CC", 
"CC ", "CC or CTH+RVC>=50", "CC+ECTC", "CC+ECTC or CTH+RVC>=50", 
"CC+ECTC+TECH", "CC+RVC(45)", "CC+TECH", "CTH", "CTH ", "CTH or CTSH+ECTC+RVC>=50", 
"CTH or CTSH+RVC<50", "CTH or CTSH+RVC<50 ", "CTH or CTSH+RVC>=50", 
"CTH or CTSH+RVC>=50 ", "CTH or RVC>=50", "CTH+ECTC", "CTH+ECTC ", 
"CTH+ECTC or CTH+RVC<50", "CTH+ECTC or CTH+RVC>=50", "CTH+ECTC or CTSH+RVC<50", 
"CTH+ECTC or CTSH+RVC>=50", "CTH+ECTC or RVC>=50", "CTH+RVC(45)", 
"CTH+RVC<50", "CTH+RVC>=50", "CTH+RVC>=50 ", "CTH+RVC>50", "cTSH", 
"CTSH", "CTSH or RVC(45)", "CTSH or RVC<50", "CTSH or RVC>=50", 
"CTSH+ECTC", "CTSH+RVC<50", "CTSH+RVC>=50", "RVC>=50 ", "RVC>50"
), class = "factor")), .Names = c("V1", "V2"), row.names = c(NA, 
50L), class = "data.frame")

这是计数代码。

  for(j in 2:50){
      if(a[j,2] == b[j,2] ){
        count = count+1
      }
  }

我收到此错误消息

Error in Ops.factor(a[j, 2], b[j, 2]) : 
  level sets of factors are different

【问题讨论】:

标签: r database compare


【解决方案1】:

您可以这样做,正如@akrun 所指出的,您的 V2 列同时包含 A 和 B 中的因子,您必须将其转换为字符,您可以使用 Map 逐个元素比较:

您可以使用str 函数作为str(A)str(B) 检查您的数据结构(它会告诉您哪些列在因子/字符/数字中)。你也可以使用dplyr::glimpse 来做同样的事情。

> A$V2 <- as.character(A$V2)
> B$V2 <- as.character(B$V2)
> Map(`==`, A, B)

如果您想计算列的匹配值,您也可以扩展 Map,如下所示。

Map(`sum`,Map(`==`, A, B))

如果您想从某一行开始,您可以编辑 Map 功能如下:

Map(`==`, A[2:nrow(A),], B[2:nrow(B),])

以防万一需要从第 2 行开始。

【讨论】:

  • 请注意,OP 的循环从 2 开始,而不是 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
相关资源
最近更新 更多