我觉得 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应该有更人工智能(?)的方法?