2014-09-24 64 views
0

我有一个数据集,我需要应用一些简单的规范化。我想要做的是计算与colSums(DF) colSums比我用colSums划分一列内的所有值。这是我做的,它似乎工作,但我不能看到是否正确的colSum已被用于每列。我的数据帧是这样的:如何划分所有列的总和

structure(list(`2E` = c(28L, 9736L, 20L, 221L, 349L, 21L), `2I` = c(42L, 
8254L, 0L, 292L, 106L, 0L), `6E` = c(49L, 4303L, 0L, 1L, 258L, 
0L), `6I` = c(0L, 3409L, 0L, 70L, 92L, 0L), `15E` = c(0L, 4178L, 
0L, 121L, 106L, 12L), `15I` = c(0L, 3L, 0L, 0L, 0L, 0L), `16E` = c(25L, 
9715L, 4L, 167L, 533L, 30L), `16I` = c(0L, 5082L, 12L, 112L, 
35L, 0L), `18E` = c(0L, 7425L, 0L, 134L, 324L, 0L), `18I` = c(0L, 
15822L, 0L, 565L, 78L, 0L), `20E` = c(0L, 69881L, 0L, 2240L, 
3764L, 189L), `20I` = c(0L, 27718L, 0L, 837L, 312L, 239L), `21E` = c(0L, 
8841L, 5L, 241L, 458L, 12L), `21I` = c(0L, 308L, 0L, 9L, 14L, 
0L), `22E` = c(52L, 34347L, 0L, 523L, 1861L, 44L), `22I` = c(0L, 
4202L, 0L, 152L, 58L, 0L), `23E` = c(0L, 3742L, 0L, 30L, 185L, 
0L), `23I` = c(31L, 3766L, 0L, 108L, 38L, 12L), `25E` = c(0L, 
3647L, 0L, 26L, 189L, 0L), `25I` = c(0L, 11243L, 0L, 903L, 85L, 
168L), `26E` = c(0L, 8162L, 0L, 56L, 753L, 0L), `26I` = c(0L, 
6325L, 3L, 229L, 85L, 0L), `27E` = c(22L, 7548L, 0L, 119L, 213L, 
0L), `27I` = c(4L, 8949L, 0L, 1009L, 114L, 0L), `28E` = c(0L, 
6103L, 0L, 100L, 319L, 68L), `28I` = c(0L, 13306L, 0L, 582L, 
57L, 0L), `29E` = c(0L, 3608L, 9L, 54L, 142L, 27L), `29I` = c(0L, 
5035L, 0L, 138L, 84L, 0L), `30E` = c(0L, 27795L, 0L, 593L, 1680L, 
35L), `30I` = c(0L, 5506L, 0L, 146L, 75L, 0L), `32E` = c(13L, 
12516L, 22L, 230L, 745L, 17L), `32I` = c(0L, 1271L, 0L, 29L, 
13L, 0L), `33E` = c(0L, 3551L, 0L, 0L, 148L, 0L), `33I` = c(0L, 
15957L, 0L, 550L, 1L, 0L), `34E` = c(0L, 1852L, 0L, 18L, 138L, 
0L), `34I` = c(0L, 10469L, 0L, 243L, 119L, 0L), `35E` = c(0L, 
9570L, 0L, 362L, 671L, 0L), `35I` = c(19L, 4953L, 0L, 25L, 32L, 
23L), `36E` = c(0L, 2497L, 15L, 55L, 125L, 4L), `36I` = c(0L, 
1839L, 11L, 39L, 0L, 0L), `38E` = c(0L, 940L, 0L, 38L, 50L, 0L 
), `38I` = c(0L, 2301L, 0L, 60L, 14L, 8L), `39E` = c(0L, 5324L, 
0L, 107L, 92L, 41L), `39I` = c(0L, 8360L, 0L, 262L, 13L, 0L), 
    `40E` = c(15L, 6107L, 10L, 183L, 173L, 13L), `40I` = c(8L, 
    1517L, 0L, 16L, 10L, 0L), `42E` = c(0L, 14681L, 35L, 312L, 
    282L, 54L), `42I` = c(0L, 7385L, 1L, 138L, 48L, 0L)), .Names = c("2E", 
"2I", "6E", "6I", "15E", "15I", "16E", "16I", "18E", "18I", "20E", 
"20I", "21E", "21I", "22E", "22I", "23E", "23I", "25E", "25I", 
"26E", "26I", "27E", "27I", "28E", "28I", "29E", "29I", "30E", 
"30I", "32E", "32I", "33E", "33I", "34E", "34I", "35E", "35I", 
"36E", "36I", "38E", "38I", "39E", "39I", "40E", "40I", "42E", 
"42I"), row.names = c("DQ459412", "DQ459413", "DQ459415", "DQ459418", 
"DQ459419", "DQ459420"), class = "data.frame") 

所以我有我的数据帧,计算colSums。然后只是简单地计数/ colSums。现在会使用colSums中的所有值还是第一个?

还需要知道的一点是,colSums应该使用与计数数据帧中相同的colname进行分配。所以一列的colSums应该被用来划分这个列。

+1

这是什么R正在做的是一个重复:http://stackoverflow.com/questions/20596433/how 20596490#20596490 – 2014-09-24 14:34:00

+0

@ G.Grothendieck我知道这个问题已被更频繁地询问,但重点是我想知道怎么只用colSums工作来区分countsDF。因为它似乎有效,但没有什么能够让你跟踪,除了手动分割和自动比较。我只是想知道是否有办法跟踪这一点。也许我必须改变我的问题 – 2014-09-24 14:38:34

回答

1

看,当你犯了一个data.frame/vector

> x <- data.frame(x = rep(1, 5), y = rep(1, 5)) 
> x/c(1,2) 
x y 
1 1.0 0.5 
2 0.5 1.0 
3 1.0 0.5 
4 0.5 1.0 
5 1.0 0.5 

它同样当你data.frame/colSums(data.frame)

1

您需要知道的两件事才能正确理解当您尝试将DF除以colSums(DF)时发生了什么。

  1. ř存储其继column-major order阵列,这意味着,如果一个有N×M个矩阵,该阵列的第二个元素将是[2,1](而不是[1,2])。

  2. R中的算术运算是矢量化的。当你用另一个矢量划分矢量时,R将第一个矢量的第一个元素除以第二个矢量的第一个矢量,然后第二个矢量除以第二个矢量,第三个除以第三个矢量,依此类推,再循环如果需要更短。

那么,当您尝试DF/colSums(DF)会发生什么?第一个操作数被强制为一个矩阵,第二个操作数是一个向量。结果对象的第一个元素将是DF[1,1]/colSums(DF)[1]。到现在为止还挺好。但第二个将是DF[2,1]/colSums(DF)[2]:这不是我们想要的!我们想要DF[2,1]/colSums(DF)[1],因为我们仍然在第一列。

如果你明白这里发生了什么,你应该能够找到一种方法来实现你想要的。