这是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
答案 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))