Re: [問題] 如何整理數量位置資料如:1胃,2腸

作者: andrew43 (討厭有好心推文後刪文者)   2015-07-10 18:20:27
我覺得 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應該有更人工智慧(?)的方法?
作者: helixc (@_2;)   2015-07-10 20:16:00
好多新函式要學,感謝
作者: leo0650 (呂奕)   2015-07-11 18:37:00
gsub() 中的regular expression應用,對於非正規化資料的清整是非常強大的工具,可利用簡單的規則式子取得想要的結果

Links booklink

Contact Us: admin [ a t ] ucptt.com