我有一个函数可以作用于多个列,但我想调整它以使用每个列的主变量mode
的不同值。我在下面给出了一个简化的例子。
我的数据是频率的交叉列表,即在A01栏中有6485个13个CAG计数,35个计数14个CAG等。因此第1列的模态值为13。
我需要计算:
1)使用偏差(均值 - 模式)/ sd
2)CAG> 1的每列的比例。比模式
以下代码适用于此。
但是,我现在需要将每个样本与对照样本的模式进行比较,我对代码有点困惑。每个需要比较的样本在表controls
中定义。
我可以请求帮助调整我的代码,以便使用适当的控制模式为每列计算skewmode和prop吗? br />我希望这是有道理的!
#Data set
data <- data.frame(CAG = c(13, 14, 15, 17),
A01 = c(6485,35,132, 12),
A02 = c(0,42,56, 4))
#Mode
mode <- data[sapply(data[2:ncol(data)], which.max), ]$CAG
#Summary statistics
sumstats <- sapply(data[, 2:ncol(data)], function(x) {
data_e <- rep(data$CAG, x)
library(psych)
data.frame(
describe(data_e)
)
})
sumstats <- as.data.frame(t(sumstats))
sumstats[] <- lapply(sumstats, function(x) {
as.numeric(x)
})
# Results table
results <- data.frame(mode, sumstats)
# Skewness - I'd like to replace 'results$mode' here
# with the relevant mode from the controls table
skewmode <- (results$mean - results$mode) / results$sd
# Proportion > mode I'd like to replace 'mod' here
# with the relevant mode from the controls table
prop <- lapply(data[, 2:ncol(data)], function(x) {
mod <- data$CAG[which.max(x)]
B <- sum(x[data$CAG >= mod])
A <- sum(x[data$CAG <= mod])
B/(A+B)
})
prop <- as.data.frame(prop)
prop <- t(prop)
results <- data.frame(mode, sumstats, skewmode, prop)
# Controls
ctrls <- data.frame(samples = c('A01', 'A02', 'A03', 'A04'),
ctrl = c('A01','A01', 'A03', 'A03'))
答案 0 :(得分:0)
考虑Map
(mapply
的包装器),它将样本模式和控制模式迭代地传递到定义的函数{{1 ,计算 skewmode 和 prop 。最后,输出最终行绑定的数据帧列表。
注意:下面用基础R prop_skew_calc()
演示,因为我没有 psyche 包。但是,我在代码中留下了关于如何整合summary()
的评论,其中docs表示返回对心理测量学有用的摘要统计数据框:
数据 (添加A03和A04)
psych::describe()
函数 (删除任何l / sapply循环,因为标量值将通过Map迭代传递)
#Data set
data <- data.frame(CAG = c(13, 14, 15, 17),
A01 = c(6485,35,132, 12),
A02 = c(0,42,56, 4),
A03 = c(33,5014,2221, 18),
A04 = c(106,89,436, 11))
#Controls
ctrls <- data.frame(samples = c('A01', 'A02', 'A03', 'A04'),
ctrl = c('A01','A01', 'A03', 'A03'))
地图 (调用上面的函数,传递ctrl数据框的列)
library(psych)
prop_skew_calc <- function(x, y) {
#Mode
samplemode <- data$CAG[which.max(data[[x]])]
cntrlmode <- data$CAG[which.max(data[[y]])]
#Summary statistics
sumstats <- summary(rep(data$CAG, data[[x]])) # R base's summary()
sumstats <- as.data.frame(t(unclass(sumstats)))
#sumstats <- describe(rep(data$CAG, data[[x]])) # pysche's describe()
#sumstats <- as.data.frame(t(sumstats))
# Results table
results <- data.frame(cntrlmode, sumstats)
# Skewness
skewmode <- (results$Mean - results$cntrlmode) / results$Min
# Proportion
B <- sum(data[data$CAG >= cntrlmode, x])
A <- sum(data[data$CAG <= cntrlmode, x])
prop <- B/(A+B)
results <- data.frame(samplemode, cntrlmode, sumstats, skewmode, prop=prop)
}