R_Language 板


LINE

※ 引述《celestialgod (天)》之銘言: : ※ 引述《wmj10054039 (MJ)》之銘言: : : [問題類型]: : : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : : 入門(寫過其他程式,只是對語法不熟悉) : : [問題敘述]: : : 我目前整理了一份學校所有課程的時間表,想知道不同星期,不同地點,各時段的 : : 人數統計。dataframe資料範例如下: : : 流水號 課程名稱 時間 地點 人數 : : 102 A 二3,4四5,7 甲 10 : : 248 B 一1,2,3 乙 20 : : 314 C 三4五7,8,a 丙 5 : : 想請問各位可以用甚麼方法對時間那一欄作字串切割變成以下新的dataframe : : 流水號 課程名稱 星期 節次 地點 人數 : : 102 A 二 3 甲 10 : : 102 A 二 4 甲 10 : : 102 A 四 5 甲 10 : : 102 A 四 7 甲 10 : : 248 B 一 1 乙 20 : : 248 B 一 2 乙 20 : : . . : : . . : : . . : : 目前想法只有想到for迴圈搭配strspilt,但還是想不到實際寫法,麻煩各位指教了,謝謝 : : [環境敘述] : : R version 3.4.2 : 程式: : library(data.table) : library(pipeR) : library(stringr) : dataStr <- "流水號 課程名稱 時間 地點 人數 : 102 A 二3,4四5,7 甲 10 : 248 B 一1,2,3 乙 20 : 314 C 三4五7,8,a 丙 5" : removeEmptyFunc <- function(x) x[nchar(x) > 0] : fread(dataStr) %>>% : `[`(j = `:=`(星期 = str_split(時間, "[a-zA-Z0-9,]+") %>>% : lapply(removeEmptyFunc), : 節次 = str_split(時間, "[^a-zA-Z0-9,]+") %>>% : lapply(removeEmptyFunc))) %>>% : `[`(j = .(星期 = unlist(星期), 節次 = unlist(節次)), : by = .(流水號, 課程名稱, 地點, 人數)) %>>% : `[`(j = `:=`(節次 = str_split(節次, ","))) %>>% : `[`(j = .(節次 = unlist(節次)), by = .(流水號, 課程名稱, 地點, 人數, 星期)) : ## no pipe 程式碼 : dataDT <- fread(dataStr) : dataDT[ , `:=`(星期 = lapply(str_split(時間, "[a-zA-Z0-9,]+"), : removeEmptyFunc), : 節次 = lapply(str_split(時間, "[^a-zA-Z0-9,]+"), : removeEmptyFunc))] : tmpDT <- dataDT[ , .(星期 = unlist(星期), 節次 = unlist(節次)), : by = .(流水號, 課程名稱, 地點, 人數)] : tmpDT[ , `:=`(節次 = str_split(節次, ","))] : tmpDT[ , .(節次 = unlist(節次)), by = .(流水號, 課程名稱, 地點, 人數, 星期)] : 結果: : # 流水號 課程名稱 地點 人數 星期 節次 : # 1: 102 A 甲 10 二 3 : # 2: 102 A 甲 10 二 4 : # 3: 102 A 甲 10 四 5 : # 4: 102 A 甲 10 四 7 : # 5: 248 B 乙 20 一 1 : # 6: 248 B 乙 20 一 2 : # 7: 248 B 乙 20 一 3 : # 8: 314 C 丙 5 三 4 : # 9: 314 C 丙 5 五 7 : # 10: 314 C 丙 5 五 8 : # 11: 314 C 丙 5 五 a 我在回應區的問題是想要把如果節次包含3節以上的課程,只取出頭跟尾的節次,並且只有 一節課的課程重複兩次,也就是說每個課程重複在dataframe的次數都會是偶數倍(主要 目的是想知道每個時段下不同地點會產生的進出人數),舉例來說: 流水號 課程名稱 時間 人數 地點 102 A 二3,4四5,7 10 甲 248 B 一1,2,3 20 乙 314 C 三4五7,8,a 5 丙 整理成 流水號 課程名稱 地點 人數 星期 節次 102 A 甲 10 二 3 102 A 甲 10 二 4 . . . . . . 248 B 乙 20 一 1 248 B 乙 20 一 3 314 C 丙 5 三 4 314 C 丙 5 三 4 314 C 丙 5 五 7 314 C 丙 5 五 a 我目前的想法是利用c大處理我之前問題的方法,將已經把時間拆開成星期跟節次但 還沒unlist的節次取出,用迴圈搭配條件判斷存成新的list再放回data.frame,但發現 這個方法存成的list只會有最後一個元素有值,其他都是NULL。想請教是哪邊有錯誤, 或是有更好的解決方法,謝謝。 [程式範例] oldlist = df$節次 newlist = list() for (i in length(oldlist)) { if (length(oldlist[[i]]) == 1){ newlist[[i]] = rep(oldlist[[i]][1], 2) }else if (length(oldlist[[i]]) == 2){ newlist[[i]] = c(oldlist[[i]][1], oldlist[[i]][2]) }else if (length(oldlist[[i]]) == 3){ newlist[[i]] = c(oldlist[[i]][1], olslist[[i]][3]) } } --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.121
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1528278141.A.A02.html
1F:→ wmj10054039: 我知道哪邊寫錯了 感謝~ 06/07 20:44







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP