使用向量作为公式

时间:2017-07-01 08:07:51

标签: r

我有一个函数可以作用于多个列,但我想调整它以使用每个列的主变量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'))

1 个答案:

答案 0 :(得分:0)

考虑Mapmapply的包装器),它将样本模式控制模式迭代地传递到定义的函数{{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)
}