如何确保在融化数据时,所有可能的变量都得到证明?

时间:2014-08-14 13:35:11

标签: r variables casting melt

编辑2:更新了起始数据

编辑1: 我想知道如何修改熔化函数中的数据或参数(可能忽略或不理解),然后再将其熔化为长形。

我从以下数据开始:

             type1 type2 type3 type4 
A            43   0     1       0 
B             6   0     1       0 
C            16   0     3       1 
D            17   0     2       2

当它融化时,它看起来像:

    Sample variable count proportion
1  A       type1    43 0.97727273
2  A       type2     0 0.00000000
3  A       type3     1 0.02272727
4  A       type4     0 0.00000000
5  B       type1     6 0.85714286
6  B       type2     0 0.00000000
7  B       type3     1 0.14285714
8  B       type4     0 0.00000000
9  C       type1    16 0.80000000
10 C       type2     0 0.00000000
11 C       type3     3 0.15000000
12 C       type4     1 0.05000000

但是,总的来说,应该将type1改为type5作为所有可能的变量。由于数据不包含任何类型5,因此它不是融化数据的一部分。我想在表中的每个样本的所有变量。因此对于数据没有的类型5,我希望Sample type5 0 0,而不是没有条目。我已经看过熔化和铸造的API,但无法找到上述查询的答案。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

更新

数据表非常适合此类问题。可能需要一些练习来真正了解它们的工作方式,但作为奖励,您可以获得非常紧凑和可读的代码。

# Raw data
dat <- read.table(con <- textConnection("type1 type2 type3 type4 
A            43   0     1       0 
B             6   0     1       0 
C            16   0     3       1 
D            17   0     2       2"), header=TRUE)
dat$Sample <- rownames(dat)

# Aggregate
library("reshape2")
library("data.table") ## 1.9.2+
dt.dat <- melt(dat, value.name="count") ## melt.data.table method
dt.dat[, list(variable, count, proportion=prop.table(count)), by=Sample]

原始答案

您可以使用expand.grid创建一个包含所有可能的索引变量组合的框架,这些索引变量应存在于最终结果中,然后使用merge将值复制到该框架。

# Read in the data in your question
> dat <- read.table(con <- textConnection("Sample variable count proportion
A      type1    15 0.93750000    
A      type2     0 0.00000000    
A      type3     1 0.06250000    
A      type4   0 0.00000000    
B      type1    13 0.86666667   
B      type2     0 0.00000000   
B      type3     2 0.13333333   
B      type4     0 0.00000000"), header=TRUE)
> close(con)

# Create all the records that should be present in the final results
> entries <- expand.grid(Sample=c("A", "B"), variable=sprintf("type%i", 1:5))

# Voilà!
> (dat <- merge(entries, dat, by=c("Sample", "variable"), all.x=TRUE))

   Sample variable count proportion
1       A    type1    15  0.9375000
2       A    type2     0  0.0000000
3       A    type3     1  0.0625000
4       A    type4     0  0.0000000
5       A    type5    NA         NA
6       B    type1    13  0.8666667
7       B    type2     0  0.0000000
8       B    type3     2  0.1333333
9       B    type4     0  0.0000000
10      B    type5    NA         NA

如果您想要0代替NA,可以像这样更改

dat[3:4] <- lapply(dat[3:4], function(x) ifelse(is.na(x), 0, x))

答案 1 :(得分:0)

在新数据集中,我假设有一个名为Sample

的列

数据

dat <-structure(list(Sample = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), type1 = c(43L, 6L, 16L, 17L), type2 = c(0L, 
0L, 0L, 0L), type3 = c(1L, 1L, 3L, 2L), type4 = c(0L, 0L, 1L, 
2L)), .Names = c("Sample", "type1", "type2", "type3", "type4"
), class = "data.frame", row.names = c(NA, -4L))

dat[setdiff(paste0("type", 1:5), colnames(dat)[-1])] <- 0
library(reshape2)

datM <- melt(dat, id.var="Sample")
datM1 <- within(datM, {proportion <-ave(value, Sample, FUN=function(x) x/sum(x))})[order(datM$Sample),]
row.names(datM1) <- 1:nrow(datM1)

 datM1
 #  Sample variable value proportion
#1       A    type1    43 0.97727273
#2       A    type2     0 0.00000000
#3       A    type3     1 0.02272727
#4       A    type4     0 0.00000000
#5       A    type5     0 0.00000000
#6       B    type1     6 0.85714286
#7       B    type2     0 0.00000000
#8       B    type3     1 0.14285714
#9       B    type4     0 0.00000000
#10      B    type5     0 0.00000000
#11      C    type1    16 0.80000000
#12      C    type2     0 0.00000000
#13      C    type3     3 0.15000000
#14      C    type4     1 0.05000000
#15      C    type5     0 0.00000000
#16      D    type1    17 0.80952381
#17      D    type2     0 0.00000000
#18      D    type3     2 0.09523810
#19      D    type4     2 0.09523810
#20      D    type5     0 0.00000000