从一个因子变量中转换多个列

时间:2014-11-25 03:25:48

标签: r casting refactoring reshape

我选择了一个糟糕的公共数据集,需要大量工作才能使其有用。这是一个简化:

 Molten<-data.frame(ID=round(runif(100, 0, 50),0), Element=c(rep("Au", 20), rep("Fe", 10),
                                                rep("Al", 30),rep("Cu", 20),rep("Au", 20)),
                 Measure=rnorm(100), Units=c(rep("ppm",10), rep("pct",10), rep("ppb", 80)))

Molten$UnitElement<-paste(Molten$Element, Molten$Units, sep="_")

  Molten<-Molten[!duplicated(Molten[,c("ID", "Element")]),]

我使用dcast到达了一个数据框,其中包含每个元素的ID和不同的列:

library(reshape2)
Cast<-dcast(Molten, ID~Element, value.var="Measure" )

但是同一元素有不同的度量单位。因此,我需要为每个元素添加一个额外的列,以指示测量记录的单位。例如,一个名为&#34; GoldUnit&#34;每个条目没有黄金计量的NA和每个填充黄金记录的测量单位。我不知道怎么回事。任何帮助,将不胜感激!

我想要的例子

  ID, Al, Al_unit, Au, Au_unit, Cu, Cu_unit, Fe, Fe_unit
  5, NA, NA, NA, NA, 1, "ppb", NA, NA
  7, NA, NA, NA, NA, NA , NA, 6, "ppb"
  3, 3, "ppb", 4, "ppm", NA, NA, NA, NA

2 个答案:

答案 0 :(得分:1)

尝试

 res <- reshape(Molten[,-5], timevar='Element', idvar='ID', direction='wide')

如果您需要更改列名

 indx1 <- grep('Units', colnames(res))
 colnames(res) <- gsub('.*\\.', '',colnames(res))
 colnames(res)[indx1] <- paste(colnames(res)[indx1], 'unit', sep="_")

 head(res,3)
 # ID         Au Au_unit Fe Fe_unit       Al Al_unit        Cu Cu_unit
 #1 26  0.8204623     ppm NA    <NA>       NA    <NA> -1.031156     ppb
 #2 38 -0.1117522     ppm NA    <NA>       NA    <NA>        NA    <NA>
 #3  6 -0.5760871     ppm NA    <NA> 1.701546     ppb  1.492658     ppb

答案 1 :(得分:1)

这应该返回您要找的内容:

library(reshape2)

Element <- c(rep("Au", 20), rep("Fe", 10),rep("Al", 30),rep("Cu", 20),rep("Au", 20))
Measure <- rnorm(100)
ID <- round(runif(100, 0, 50),0)
Units <- c(rep("ppm",10), rep("pct",10), rep("ppb", 80))

Molten <- cbind.data.frame(Element, Measure, ID, Units)
Molten <- Molten[!duplicated(Molten[,c("ID", "Element")]),]

Cast1 <- dcast(Molten, ID~Element, value.var="Measure" )
Cast2 <- dcast(Molten, ID~Element, value.var="Units" )
Cast2$ID <- NULL
names(Cast2) <- paste(names(Cast2), 'unit', sep='_')
Cast <- cbind(Cast1, Cast2)