看板 R_Language 關於我們 聯絡資訊
我覺得 reshape::melt() 之後再做點字串處理蠻直覺的。 txt <- "ID,Food A,Food B,Food C,Food E C146,,,,3腸 B287,,,,10腸 C140,,4大腸,,4腸 C133,,,1胃, C132,1腸,,, B305,,,1腸, C112,,2腸,,1胃 C120,,,,1腸 C128,,,,1腸" dt0 <- read.csv(textConnection(txt)) library(reshape) dt1 <- melt(dt0, id = c("ID"), variable_name = "Food type") dt1$value <- as.character(dt1$value) dt1 <- subset(dt1, value != "") dt1$Amount <- as.numeric(gsub("^([0-9]+)(.+)$", "\\1", dt1$value)) dt1$Location <- as.factor(gsub("^([0-9]+)(.+)$", "\\2", dt1$value)) dt2 <- dt1[sort(dt1$ID), ] dt2 為所求。 ※ 引述《helixc (@_2;)》之銘言: : [軟體熟悉度]:新手+入門 : [問題敘述]: : 手上有一筆某蛙類的解剖資料,想要分析食性。 : 紀錄的時候會長這樣: : ID,Food A,Food B,Food C,Food E : C146,,,,3腸 : B287,,,,10腸 : C140,,,,4腸 : C133,,,1腸, : C132,1腸,,, : B305,,,1腸, : C112,,2腸,,1腸 : C120,,,,1腸 : C128,,,,1腸 : 想要整理成這樣的資料: : ID, Food type, Amount, Location : C146, E, 3, 腸 : B287, E, 10, 腸 : C140, E, 4, 腸 : C133, C, 1, 腸 : 目前我知道怎麼用tidyr::gather()整理資料, : 但目前想不到要怎麼把混在一起的數字和文字分開。 : 因為數量不一定都是一位數的數字,位置也會有兩個字的狀況, : 純粹把資料當成文字硬去抽取特定位置沒辦法解決這個問題。 : 資料量不大,其實可以用Excel做, : 但我在Excel就是用left()和right()抽取最常見的位數, : 再用工人智慧去檢核。理論上在R應該有更人工智慧(?)的方法? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.37.172 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1436523630.A.358.html ※ 編輯: andrew43 (122.117.37.172), 07/10/2015 18:23:08
helixc: 好多新函式要學,感謝 07/10 20:16
leo0650: gsub() 中的regular expression應用,對於非正規化資料 07/11 18:37
leo0650: 的清整是非常強大的工具,可利用簡單的規則式子取得想要 07/11 18:37
leo0650: 的結果 07/11 18:37