精華區beta R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用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去做但沒有成功, 請問用有人可以出手指導嗎? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 120.127.237.54 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1498622259.A.BD3.html
cywhale: data.table::melt(DT,measure=patterns("^A","^B","^C")) 06/28 12:09
ianmao: df %>% dplyr::mutate(A=A1+A2,B=B1+B2,C=C1+C2+C3) %>% 06/28 15:28
ianmao: dplyr::select(A, B, C) 06/28 15:28
ianmao: 我漏了id,第二行改成dplyr::select(id, A, B, C) 06/28 15:39
ianmao: 如果ABC欄位很多,A<-df %>% select(starts_with("A") %>% 06/29 00:13
ianmao: apply(sum, MARGIN = 1),然後分別製作B,C 06/29 00:14
ianmao: 最後合併 df_final <- cbind(id = df$id, A, B, C) 06/29 00:17
> -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] 進行特定欄位加總 時間: Wed Jun 28 19:10:54 2017 ※ 引述《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) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.232.188.66 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1498648257.A.E43.html ※ 編輯: celestialgod (36.232.188.66), 06/28/2017 19:20:01