编辑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,但无法找到上述查询的答案。
有什么想法吗?谢谢!
答案 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