作者engfen (宇智波康)
看板R_Language
標題[問題] 多條件分組加總及字串相加
時間Fri Apr 12 21:39:32 2019
[問題類型]:
程式諮詢(我想用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
→ cywhale: 把變數的冒號拿掉 by=.(In_ID, Drug) 還有sum(dose) 04/12 23:20
→ cywhale: 另外你paste的右括號放錯位置,應該在collapse之後 04/12 23:21
感謝 看不到自己的盲點,經提醒後 修正程式碼 結果就能正確跑出來
不過過程似乎有點瑣碎,還在思索如何用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
→ andrew43: 此例 by 也可以略寫成 by=In_ID:Drug 04/13 02:39
太感動了 樓上用一行程式碼就解決我的問題了
※ 編輯: engfen (110.50.135.132), 04/13/2019 02:47:05
→ andrew43: 你應該只是沒有學到 .() 放在 J 和 by 的作用而已。 04/13 02:50
推 cywhale: data.table叫用column變數 .(var) "var"或外圍變數 ..var 04/13 07:14