dplyr:在两个数据tbls之间减去

时间:2017-07-11 16:13:56

标签: r dplyr

我有一个背景数据文件和一个实验数据文件。我需要的是从背景文件中计算colMeans,并从实验数据中减去相应的平均背景读数。

这很容易在基础r:

dataField1 <- "someField"
dataField2 <- "someField2"
ctrlMeans <- colMeans (read.csv ("ctrl.csv"))
exprData <- read.csv ("expr.csv")
exprData [, c(dataField1, dataField2)] <- exprData [, c(dataField1, dataField2)] - ctrlMeans [c(dataField1, dataField2)]

但我发现在dplyr中难以实现最后一步。我能得到的最好的是:

ctrlMeansTbl <- read_csv ('ctrl.csv') %>% summarize_all (mean)
exprDataTbl<- read_csv('expr.csv') %>% mutate (
  dataField1 := !! quo (dataField1) - select (ctrlMeansTbl, !!quo (dataField1)),
  dataField2 := !! quo (dataField2) - select (ctrlMeansTbl, !!quo (dataField2))
)

但这会引发错误:

Error in rep_len(as.vector(e1), prod(dim(e2))) : 
  attempt to replicate non-vector

为了清楚起见,ctrlMeansTblexprDataTbl(变异之前)的格式如下:

> head (ctrlMeansTbl)
# A tibble: 1 x 4
  `someField1` `someField2` `someField3`    `someField4`
       <dbl>    <dbl>            <dbl>   <dbl>
1   489.7096 74.24759         547.9139 16.0828
> head (donorSingle)
# A tibble: 6 x 4
  `someField1` `someField2` `someField3`    `someField4`
       <dbl>    <dbl>            <dbl>    <dbl>
1  132123.44  1560.74        166069.17 0.619378
2   11125.93   156.95         14045.20 0.620412
3   14590.51   243.82         18132.47 0.621446
4   76014.17   839.50         95961.42 0.623514
5   91344.17  1054.85        115226.85 0.627650
6    7651.86   146.73          9528.69 0.631786

有人对此有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您的问题是您使用select来获取要减去的值。但是,此函数返回数据帧而不是向量。我会尝试以这种方式调整您的代码:

ctrlMeansTbl <- read_csv ('ctrl.csv') %>% summarize_all (mean)
  exprDataTbl<- read_csv('expr.csv') %>% mutate (
  dataField1 := !! quo (dataField1) - ctrlMeansTbl$dataField1,
  dataField2 := !! quo (dataField2) - ctrlMeansTbl$dataField2
)

答案 1 :(得分:1)

没有可重复的示例,但您可以直接减去意味着:

mtcars %>% mutate_all(funs(. - mean(.)))

更通用的purrr解决方案是:

map2_df(mtcars, colMeans(mtcars), `-`)

话虽如此,基本方式对我来说似乎完全没问题。

答案 2 :(得分:0)

将您想要的列mutate定义为向量(thesecols)。制作并选择ctrlMeansTbl

的相关列
library(dplyr)
thesecols <- c("mpg","cyl")
ctrlMeansTbl <- read_csv('ctrl.csv') %>%
                   summarize_all(mean) %>% 
                   select(thesecols)

按列

制作iterator ctrlMeansTbl
library(iterators)
bycol <- iter(ctrlMeansTbl,by="col")

使用mutate_atnextElem

exprDataTbl<- read_csv('expr.csv') %>% 
                  mutate_at(vars(thesecols), funs(. - nextElem(bycol)))