簡體   English   中英

r - lapply將列除以來自不同數據集的整數值,意外結果

[英]r - lapply divides a column by an integer value from different dataset, unexpected result

我有兩個data.frames,一個有基因型計數,另一個有一個數字,我需要從第一個數據集中規范化我的計數。

countsdata=data.frame(genotype1=rep(c(10,20,30,40),each=1),
                       genotype2=rep(c(100,200,300,400),each=1),
                       genotype3=rep(c(40,50,60,70),each=1),
                       genotype4=rep(c(40,50,60,70),each=1)
                      )
coldata = data.frame(Group =c('genotype1', 'genotype2', 'genotype3', 'genotype4'),
                     Treatment = rep(c("control","treated"),each = 2),
                     Norm=rep(c(1,2,5,5)))

我確保我的變量沒有因素

factorsCharacter <- function(d) modifyList(d, lapply(d[, sapply(d, is.factor)],   
                                                     as.character))
coldata=factorsCharacter(coldata)

然后我看到lapply循環遍歷我的計數,當時一列,並通過我的coldata包含標准化值(Norm)。 一切都很好看,直到我在同一步驟中結合這兩個動作

> lapply(coldata['Group'],function(group_i){group_i})
$Group
[1] "genotype1" "genotype2" "genotype3" "genotype4"

> lapply(coldata['Group'],function(group_i){countsdata[,group_i]})
$Group
  genotype1 genotype2 genotype3 genotype4
1        10       100        40        40
2        20       200        50        50
3        30       300        60        60
4        40       400        70        70

> lapply(coldata['Group'],function(group_i){as.integer(coldata[coldata$Group==group_i,'Norm'])})
$Group
[1] 1 2 5 5

> lapply(coldata['Group'],function(group_i){
+ countsdata[,group_i]/as.integer(coldata[coldata$Group==group_i,'Norm'])
+ })
$Group
  genotype1 genotype2 genotype3 genotype4
1        10       100        40        40
2        10       100        25        25
3         6        60        12        12
4         8        80        14        14

這里的結果不是我所期望的(將每列除以其歸一化數)。 在進一步檢查之后,我注意到它按行進行了規范化,換句話說,它是在不同列之間進行規范化的,這不應該是這種情況,因為我正在循環遍歷一列。 我可能錯過了一個基本的概念,但通過其他SO帖子找不到我可以使用的任何東西。 我的目標是修復代碼以進行正確的計算,但我也想了解為什么上面的代碼不起作用。 非常感謝。

問題在於使用[而不是[[ 因此,我們有一個長度為1且包含所有元素的list ,而不是循環遍歷“Group”列list的每個元素。 因此,要么使用coldata[, 'Group'] ,要么使用coldata[, 'Group'] coldata[['Group']]coldata$Group進行循環。

countsdataNew <- countsdata
countsdataNew[] <- lapply(coldata[['Group']],function(group_i)
                   countsdata[,group_i]/coldata$Norm[coldata$Group==group_i])
countsdataNew
#  genotype1 genotype2 genotype3 genotype4
#1        10        50         8         8
#2        20       100        10        10
#3        30       150        12        12
#4        40       200        14        14

如果'countsdata'中的列名和'countsdata'中的'Group'列的順序相同,我們可以使用Map輕松完成

Map(`/`, countsdata, coldata$Norm)

或者只是復制'Norm'並進行簡單的划分

countsdata/coldata$Norm[col(countsdata)]

或者sweep

sweep(countsdata, 2, coldata$Norm, "/")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM