【问题标题】:Remove a table from a dataset [duplicate]从数据集中删除表 [重复]
【发布时间】:2015-03-14 08:44:18
【问题描述】:

我无法从数据集中删除选定的数据。我有一个集合示例,并且我有另一个选定行的表(删除)。我正在尝试从原始集合中删除(删除)。

我尝试使用setdiff,但是虽然有行被削减(根据环境变量),但它并没有被选中的数据删除。

Prod1

dput 中整个数据集的示例:

Prod <- structure(list(CountryCode = c(5000L, 5300L, 5300L, 5000L, 5400L, 
5300L, 5400L, 5200L, 5200L, 5200L, 5000L, 5000L), Country = structure(c(4L, 
2L, 2L, 4L, 3L, 2L, 3L, 1L, 1L, 1L, 4L, 4L), .Label = c("Americas + (Total)", 
"Asia + (Total)", "Europe + (Total)", "World + (Total)"), class = "factor"), 
ItemCode = c(1814L, 1717L, 1817L, 116L, 1717L, 1817L, 1817L, 
156L, 1717L, 1817L, 1735L, 1800L), Item = structure(c(3L, 
2L, 1L, 4L, 2L, 1L, 1L, 5L, 2L, 1L, 6L, 7L), .Label = c("Cereals (Rice Milled Eqv) + (Total)", 
"Cereals,Total + (Total)", "Coarse Grain, Total + (Total)", 
"Potatoes", "Sugar cane", "Vegetables Primary + (Total)", 
"Vegetables&Melons, Total + (Total)"), class = "factor"), 
ElementGroup = c(31L, 31L, 31L, 51L, 51L, 51L, 51L, 51L, 
51L, 51L, 51L, 51L), ElementCode = c(5312L, 5312L, 5312L, 
5510L, 5510L, 5510L, 5510L, 5510L, 5510L, 5510L, 5510L, 5510L
), Element = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L), .Label = c("Area harvested", "Production"
), class = "factor"), Unit = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Ha", "tonnes"
), class = "factor"), Y1961 = c(3.29e+08, 2.72e+08, 2.72e+08, 
2.71e+08, 2.64e+08, 2.63e+08, 2.63e+08, 2.36e+08, 2.28e+08, 
2.24e+08, 2.23e+08, 2.23e+08), Y1962 = c(3.27e+08, 2.76e+08, 
2.76e+08, 2.53e+08, 2.81e+08, 2.78e+08, 2.81e+08, 2.22e+08, 
2.4e+08, 2.36e+08, 2.23e+08, 2.23e+08), Y1963 = c(3.33e+08, 
2.76e+08, 2.76e+08, 2.7e+08, 2.5e+08, 2.95e+08, 2.49e+08, 
2.26e+08, 2.62e+08, 2.58e+08, 2.23e+08, 2.23e+08), Y1964 = c(3.29e+08, 
2.82e+08, 2.82e+08, 2.85e+08, 2.96e+08, 3.1e+08, 2.96e+08, 
2.43e+08, 2.49e+08, 2.45e+08, 2.26e+08, 2.26e+08)), .Names = c("CountryCode", 
"Country", "ItemCode", "Item", "ElementGroup", "ElementCode", 
"Element", "Unit", "Y1961", "Y1962", "Y1963", "Y1964"), class = "data.frame", row.names = c(NA, 
-12L))

要删除的选定数据:

toremove <- structure(list(CountryCode = c(5000L, 5400L, 5300L, 5400L, 5200L
), Country = structure(c(4L, 3L, 2L, 3L, 1L), .Label = c("Americas + (Total)", 
"Asia + (Total)", "Europe + (Total)", "World + (Total)"), class = "factor"), 
ItemCode = c(116L, 1717L, 1817L, 1817L, 1717L), Item = structure(c(3L, 
2L, 1L, 1L, 2L), .Label = c("Cereals (Rice Milled Eqv) + (Total)", 
"Cereals,Total + (Total)", "Potatoes"), class = "factor"), 
ElementGroup = c(51L, 51L, 51L, 51L, 51L), ElementCode = c(5510L, 
5510L, 5510L, 5510L, 5510L), Element = structure(c(1L, 1L, 
1L, 1L, 1L), .Label = "Production", class = "factor"), Unit = structure(c(1L, 
1L, 1L, 1L, 1L), .Label = "tonnes", class = "factor"), Y1961 = c(2.71e+08, 
2.64e+08, 2.63e+08, 2.63e+08, 2.28e+08), Y1962 = c(2.53e+08, 
2.81e+08, 2.78e+08, 2.81e+08, 2.4e+08), Y1963 = c(2.7e+08, 
2.5e+08, 2.95e+08, 2.49e+08, 2.62e+08), Y1964 = c(2.85e+08, 
2.96e+08, 3.1e+08, 2.96e+08, 2.49e+08)), .Names = c("CountryCode", 
"Country", "ItemCode", "Item", "ElementGroup", "ElementCode", 
"Element", "Unit", "Y1961", "Y1962", "Y1963", "Y1964"), class = "data.frame", row.names = c(NA, 
-5L))

【问题讨论】:

  • Prod[!(rownames(Prod) %in% rownames(toremove )),] 也许?虽然我不明白如果只需要行名,为什么要创建一个全新的数据集
  • 在这个例子中,我创建了一个新的集合 Prod1 只是为了良好的实践,所以我可以确保它有效。我不需要在最终脚本中添加新的集合。
  • 不管怎样,我不建议使用行名,因为它们在第一个子设置之后往往会混乱。你最好有一些其他更可靠的索引。

标签: r


【解决方案1】:
# Answer #1 ---------------------------------------------------------------
AnswerinComments <- Prod[!(rownames(Prod) %in% rownames(toremove )),]

也可以在这里找到:Delete rows that exist in another data frame?

# Answer #2 ---------------------------------------------------------------
require(sqldf)
AnotherWay  <- sqldf("Delete a from Prod a inner join toremove b 
                     on a.CountryCode = b.CountryCode 
                    and a.ElementCode = b. ElementCode")

# Answer #3 ---------------------------------------------------------------
all <- rbind(Prod, toremove)
duplicated(all)
YetAnother <- all[!duplicated(all,fromLast = FALSE) & 
                  !duplicated(all,fromLast = TRUE),] 

【讨论】:

    【解决方案2】:

    流行的dplyr 包也有一个setdiff 函数。但是,它需要相同的数据结构 - 在您的情况下:相同的因子级别:

    ## factors to character vectors if needed...
    # idx <- sapply(Prod, class) == "factor"
    # Prod[idx] <- sapply(Prod[idx], as.character)
    # toremove[idx] <- sapply(toremove[idx], as.character)
    library(dplyr)
    setdiff(Prod, toremove)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 2012-03-05
      相关资源
      最近更新 更多