Re: [问题] 进行特定字段加总

楼主: celestialgod (天)   2017-06-28 19:10:54
※ 引述《directly (天使的圆舞曲)》之铭言:
: [问题类型]:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 想要进行特定字段(特定变量)的加总,但不知道怎么处理
: [程式范例]:
: 资料:
: id A1 B1 B2 A2 C1 C2 C3
: 1 1 2 0 4 5 6 7
: 2 5 6 8 8 1 3 2
: 请问如果我希望
: A1+A2形成一个新的变量,变成新的一栏叫作A,
: B1+B2形成一个新的变量,变成新的一栏叫作B,
: C1+C2+C3形成一个新的变量,变成新的一栏叫作C,
: 想要得到:
: id A B C
: 1 5 2 18
: 2 13 14 6
: 我试着用aggregate、colSums去做但没有成功,
: 请问用有人可以出手指导吗?
: 谢谢!
以下共七种方法,自行选择适用的XD
rlang + dplyr我还没试出来Orz,这新东西真的搞不太懂
library(data.table)
DT <- fread("id A1 B1 B2 A2 C1 C2 C3
1 1 2 0 4 5 6 7
2 5 6 8 8 1 3 2")
DF <- copy(DT)
setDF(DF)
# base, transform + subset
subset(transform(DF, A = A1 + A2, B = B1 + B2, C = C1 + C2 + C3),
select = c(id, A, B, C))
# id A B C
# 1 1 5 2 18
# 2 2 13 14 6
# base, eval
res <- sapply(c("A", "B", "C"), function(ch){
expr <- paste0(names(DT)[grepl(paste0("^", ch), names(DT))], collapse = "+")
eval(parse(text = expr), DF, parent.frame())
})
cbind(id = DF$id, as.data.frame(res))
# id A B C
# 1 1 5 2 18
# 2 2 13 14 6
# data.table, method 1
DT[ , .(A = A1 + A2, B = B1 + B2, C = C1 + C2 + C3) , by = .(id)]
# id A B C
# 1: 1 5 2 18
# 2: 2 13 14 6
# data.table, method 2
exprs <- lapply(c("A", "B", "C"), function(ch){
parse(text = paste0(names(DT)[grepl(paste0("^", ch), names(DT))], collapse
= "+"))
})
names(exprs) <- c("A", "B", "C")
DT[ , lapply(exprs, eval, envir = DT) , by = .(id)]
# id A B C
# 1: 1 5 2 18
# 2: 2 13 14 6
# data.table, method 3
lapply(c("A", "B", "C"), function(ch){
nn <- names(DT)[grepl(paste0("^", ch), names(DT))]
DT[ , eval(ch) := Reduce(function(x, y) x+y, .SD), .SDcols = nn]
DT[ , eval(nn) := NULL]
return(NULL)
})
DT
# id A B C
# 1: 1 5 2 18
# 2: 2 13 14 6
library(dplyr)
# dplyr, method 1
DF %>% group_by(id) %>%
summarise(A = A1 + A2, B = B1 + B2, C = C1 + C2 + C3)
# # A tibble: 2 x 4
# id A B C
# <int> <int> <int> <int>
# 1 1 5 2 18
# 2 2 13 14 6
# dplyr, method 2
exprs <- lapply(c("A", "B", "C"), function(ch){
paste0(names(DF)[grepl(paste0("^", ch), names(DF))], collapse = "+")
})
names(exprs) <- c("A", "B", "C")
DF %>% group_by(id) %>% summarise_(.dots = exprs)

Links booklink

Contact Us: admin [ a t ] ucptt.com