我正在使用包含5列的数据表:
gene_id, length, sample1_count, sample2_count, sample3_count
我想在现有表中添加3个新列,它们代表sample1,sample2和sample3的标准化计数(即将每个基因的每个样本计数除以计数总数)。
如何创建3个新列?或者,当我第一次在unix中生成文件时,是否需要执行此操作?
答案 0 :(得分:1)
我们可以使用data.table
方式来执行此操作
library(data.table)
nm1 <- grep("^sample\\d+_count", names(df1), value = TRUE)
setDT(df1)[, paste0("Norm_", nm1) := lapply(.SD, `/`, .N), gene_id, .SDcols = nm1]
如果要除以sum
setDT(df1)[, paste0("Norm_", nm1) := lapply(.SD, function(x) x/sum(x)),
gene_id, .SDcols = nm1]
答案 1 :(得分:0)
可能有助于包含一个最小可重复的示例,但以下内容将调用一个函数,用于将字段除以mtcars
数据集中的柱面数,并将输出存储在新的变量名下:
mtcars
fields_input <- c('hp', 'disp')
fields_output <- c('hp_per_cyl', 'disp_per_cyl')
divide_by_cyl <- function(v) v / mtcars[['cyl']]
mtcars[fields_output] <- lapply(mtcars[fields_input], divide_by_cyl)
mtcars
答案 2 :(得分:0)
以下是一些可重现的数据:
set.seed(1)
df <- data.frame(gene_id = 1:5,
length = sample(1:100, 5),
sample1_count = sample(1:10, 5),
sample2_count = sample(1:10, 5),
sample3_count = sample(1:10, 5))
这是如何通过样本计数进行标准化,重命名标准化列并最终将标准化列连接到原始数据框(使用基本R函数):
norms <- sapply(df[ c("sample1_count", "sample2_count", "sample3_count")], function(x) x/sum(x))
colnames(norms) <- sub("count", "norm", colnames(norms))
df2 <- cbind(df, norms)
以下是标准化计数:
df2[, c("gene_id", "length", "sample1_norm", "sample2_norm", "sample3_norm")]
gene_id length sample1_norm sample2_norm sample3_norm
1 1 27 0.29032258 0.11538462 0.15151515
2 2 37 0.32258065 0.07692308 0.21212121
3 3 57 0.19354839 0.23076923 0.24242424
4 4 89 0.16129032 0.38461538 0.09090909
5 5 20 0.03225806 0.19230769 0.30303030
答案 3 :(得分:0)
在我看来,使用长格式可以更好地表示您的数据。使用长格式并使用data.table
,您的问题变得更加简单:
# Some sample data
dt <- data.table(
gene_id = sample(LETTERS, 10),
length = sample(1:25, 10),
sample1 = sample(1:1000, 10),
sample2 = sample(1:1000, 10),
sample3 = sample(1:1000, 10))
# Convert to long format
dt_long = melt(dt, id.vars = c("gene_id", "length"), value.name = "count")
# Calculate your normalized counts for each gene_id / length combination
dt_long[, normalized_count := count / sum(count), by = c("gene_id", "length")]
如果您需要再次以宽格式输出,可以始终使用:
dcast(dt_long, gene_id + length ~ variable)
得到:
gene_id length sample1 sample2 sample3
1: B 16 0.2666667 0.05232068 0.68101266
2: C 6 0.7737226 0.01459854 0.21167883
3: J 3 0.4131455 0.41549296 0.17136150
4: P 13 0.4846847 0.44054054 0.07477477
5: Q 23 0.3425573 0.11545802 0.54198473
6: R 12 0.6018576 0.21114551 0.18699690
7: S 4 0.5416924 0.30759728 0.15071032
8: T 24 0.1838666 0.40694006 0.40919333
9: X 11 0.4468085 0.45319149 0.10000000
10: Z 20 0.2267706 0.43144899 0.34178038