[問題] 多條件分組加總及字串相加

看板R_Language作者 (宇智波康)時間5年前 (2019/04/12 21:39), 5年前編輯推噓1(106)
留言7則, 2人參與, 5年前最新討論串1/1
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 新手 [問題敘述]: 我有一組資料,資料格式如下 https://i.imgur.com/twxssIj.png
我想依據住院序號(In_ID)及藥物名稱(Drug),把當次住院期間, 開同一種學名藥的劑量(dose)加總起來, 以及用法(usage)字串相加, 其他欄位(例如病歷號、年齡、性別)則保持不變。 並把結果匯出來成另一個檔案 希望呈現以下結果 https://i.imgur.com/UD40lg6.png
但一直出現下列錯誤訊息 Error in `[.data.table`(test, , { : The items in the 'by' or 'keyby' list are length (1,1). Each must be length 13; the same length as there are rows in x (after subsetting if i is provided). 完全不知道如何解Bug 只能請各位指點迷津 範例檔有放在雲端 https://nofile.io/f/yMTmqZody3d/test.xlsx [程式範例]: library(readxl) library(data.table) test <- read_excel("D:/test.xlsx",sheet = "eng") setDT(test) test[,{.(prod=paste("usage"),collapse=",")}, by=.("In_ID", "Drug")] test[,{dose.sum:=sum("dose")}, by=.("In_ID", "Drug")] test2 <- test[, .SD[.N], by =.("In_ID", "Drug")] [環境敘述]: R version 3.4.4 (2018-03-15) Windows 10 [關鍵字]: 多條件相加、字串合併 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.50.135.132 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1555076376.A.EFE.html

04/12 23:20, 5年前 , 1F
把變數的冒號拿掉 by=.(In_ID, Drug) 還有sum(dose)
04/12 23:20, 1F

04/12 23:21, 5年前 , 2F
另外你paste的右括號放錯位置,應該在collapse之後
04/12 23:21, 2F
感謝 看不到自己的盲點,經提醒後 修正程式碼 結果就能正確跑出來 不過過程似乎有點瑣碎,還在思索如何用magrittr的%>%來改寫 ----------------------------------------------------------- test <- read_excel("D:/Desktop/test.xlsx",sheet = "eng") setDT(test) A <- test[,{dose.sum =sum(dose)}, by=c("In_ID", "Drug")] B <- test[,{paste(usage,collapse=",")}, by=c("In_ID", "Drug")] C <- test[, .SD[.N], by =c("In_ID", "Drug")] D <- merge(A,B,by=c("In_ID", "Drug") ) E <- merge(C,D,by=c("In_ID", "Drug") ) E$dose<-NULL E$usage<-NULL names(E)[c(6,7)] <- c("dose","usage") ------------------------------------------------------------ ※ 編輯: engfen (110.50.135.132), 04/13/2019 02:44:08

04/13 02:35, 5年前 , 3F

04/13 02:39, 5年前 , 4F
此例 by 也可以略寫成 by=In_ID:Drug
04/13 02:39, 4F
太感動了 樓上用一行程式碼就解決我的問題了 ※ 編輯: engfen (110.50.135.132), 04/13/2019 02:47:05

04/13 02:50, 5年前 , 5F
你應該只是沒有學到 .() 放在 J 和 by 的作用而已。
04/13 02:50, 5F

04/13 07:14, 5年前 , 6F
data.table叫用column變數 .(var) "var"或外圍變數 ..var
04/13 07:14, 6F

04/13 07:15, 5年前 , 7F
有點微妙,可以參考其wiki http://bit.ly/2Iu8ihp
04/13 07:15, 7F
文章代碼(AID): #1Si9KOx- (R_Language)