使用data.table条件计算列中的SUM

时间:2014-10-23 14:31:05

标签: r merge data.table plyr

这是How to output duplicated rows

的问题的继续

我有桌子:

x1  x2  x3  x4
34  14  45  53 
2   8   18  17
34  14  45  20
19  78  21  48 
2   8   18  5

您可以注意到第1行和第3行非常相似,但最后一列除外。如何计算第3列(53 + 20)中这些值的总和,并且只保留这两个相似行中的一个,但是使用data.table

输出应为:

x1  x2  x3  x4
34  14  45  73
2   8   18  22

1 个答案:

答案 0 :(得分:0)

尝试

library(data.table)
nm1 <-paste0("x",1:3)
setDT(df)[df[, duplicated(.SD)|duplicated(.SD,fromLast=TRUE), 
                 .SDcols=nm1]][, list(x4=sum(x4)), by=list(x1,x2,x3)]
#   x1 x2 x3 x4
#1: 34 14 45 73
#2:  2  8 18 22

或者

DT <- data.table(df)
setkey(DT,x1,x2,x3)
DT[duplicated(DT)|duplicated(DT,fromLast=TRUE)][, 
                 list(x4=sum(x4)), by=list(x1,x2,x3)]

#   x1 x2 x3 x4
#1:  2  8 18 22
#2: 34 14 45 73

更新

如果-''列在其他数字的列中,那么我们可以使用as.numeric并将其强制转移到NA并发出警告。例如

 dat <- data.frame(Col1= c(3, '', 2:5), Col2=c(4, 5, '-', 2, 6, 8),
           stringsAsFactors=FALSE)

 dat[] <- lapply(dat, as.numeric)
 #Warning message:
 #In lapply(dat, as.numeric) : NAs introduced by coercion
 dat
 # Col1 Col2
 #1    3    4
 #2   NA    5
 #3    2   NA
 #4    3    2
 #5    4    6
 #6    5    8

或者您可以在读取数据集时指定此项。使用保存在文件中的相同数据

read.table('fileNew.txt', sep=',',  header=TRUE, na.strings=c('', '-'))
#   Col1 Col2
#1    3    4
#2   NA    5
#3    2   NA
#4    3    2
#5    4    6
#6    5    8

数据

df <- structure(list(x1 = c(34L, 2L, 34L, 19L, 2L), x2 = c(14L, 8L, 
14L, 78L, 8L), x3 = c(45L, 18L, 45L, 21L, 18L), x4 = c(53L, 17L, 
20L, 48L, 5L)), .Names = c("x1", "x2", "x3", "x4"), class = "data.frame", row.names = c(NA, 
-5L))