【问题标题】:Checking duplicates, sum them and delete one row after summing检查重复项,对它们求和并在求和后删除一行
【发布时间】:2012-12-18 15:29:20
【问题描述】:

我有一个包含一些重复项的数据框。我想对有重复的两列的行求和,然后删除不需要的行。

这里是数据示例,

Year    ID  Lats     Longs      N   n   c_id
2015    200 30.5417 -20.5254    150 30  4142
2015    200 30.5417 -20.5254    90  50  4142

我想将 N 列和 n 列相加为一行。其余信息,即 Lats 、 Longs 、 ID 和 Year 保持不变,例如,

Year    ID  Lats    Long        N   n   c_id
2015    200 30.5417 -20.5254    240 80  4142

【问题讨论】:

  • 在上述情况下使用与 4142 相同的 c_id 重复。 c_id 是每条记录的唯一标识。

标签: r duplicates rows


【解决方案1】:

使用data.table的解决方案:

require(data.table)
df <- structure(list(year = c(2015, 2015), ID = c(200, 200), Lats = c(30.5417, 
            30.5417), Longs = c(-20.5254, -20.5254), N = c(150, 90), n = c(30, 
            50), c_id = c(4142, 4142)), .Names = c("year", "ID", "Lats", 
            "Longs", "N", "n", "c_id"), row.names = c(NA, -2L), 
            class = "data.frame")
dt <- data.table(df)
dt[, lapply(.SD, sum), by="c_id,year,ID,Lats,Longs"]

   c_id year  ID    Lats    Longs   N  n
1: 4142 2015 200 30.5417 -20.5254  240 80

使用plyr的解决方案:

require(plyr)
ddply(df, .(c_id, year, ID, Lats, Longs), function(x) c(N=sum(x$N), n=sum(x$n)))

  c_id year  ID    Lats    Longs   N  n
1 4142 2015 200 30.5417 -20.5254 240 80

【讨论】:

  • 我试图理解这段代码。我有 9222 条记录,这可以处理这么多的记录吗?
  • +1 顺便说一句,by=c("c_id", "year", "ID", "Lats", "Longs") 有一个快捷方式:by="c_id,year,ID,Lats,Longs"。逗号分隔的名称仅用于列名,但没有表达式。
  • 太棒了。另外为什么用as.data.frame 包装结果?这只是为了使它与 plyr 的结果相同吗?如果是这样,认为返回一个data.table也是可以的,它也是一个data.frame,否则新手可能会觉得他们确实必须将结果转换回data.frame,这确实会很痛苦。跨度>
  • 嗨,我正在尝试 data.table 选项,我收到此错误 eval 中的错误(expr,envir,enclos):找不到对象“YeStart”
  • IDS[, lapply(.SD, sum), by="cid, YeStart, Cluster_ID, Lat, Long"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2015-11-06
相关资源
最近更新 更多