我有一个背景数据文件和一个实验数据文件。我需要的是从背景文件中计算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
为了清楚起见,ctrlMeansTbl
和exprDataTbl
(变异之前)的格式如下:
> 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
有人对此有任何想法吗?谢谢!
答案 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_at
和nextElem
:
exprDataTbl<- read_csv('expr.csv') %>%
mutate_at(vars(thesecols), funs(. - nextElem(bycol)))