Частота ненулевого или определенного числа в столбце - PullRequest
2 голосов
/ 28 апреля 2011

Мой входной файл:

 x <- read.table(textConnection('
      t0  t1  t2  t3  t4
  aa  0   1   0   1   0
  bb  1   0   1   0   1
  cc  0   0   0   0   0
  dd  1   1   1   0   1
  ee  1   1   1   0   0
  ff  0   0   1   0   1
  gg  -1  -1  -1  -1  0
  hh  -1  1   -1  1   -1
 '), header=TRUE)

Сначала я хочу вычислить частоту каждого столбца, т.е.

          t0   t1   t2   t3   t4
freqency  5/8  5/8  6/8  3/8  4/8

И затем умножьте частоту обратно на матрицу x, чтобы получить новую матрицу следующим образом:

       t0    t1     t2     t3     t4
  aa   0     5/8    0      3/8    0
  bb   5/8   0      6/8    0      4/8
  cc   0     0      0      0      0
  dd   5/8   5/8    6/8    0      4/8
  ee   5/8   5/8    6/8    0      0
  ff   0     0      6/8    0      4/8
  gg  -5/8  -5/8   -6/8   -3/8    0
  hh  -5/8   5/8   -6/8    3/8   -4/8

Как это сделать с R? Из руководств я узнал, что prop.table (x) можно использовать для получения полной вероятности для всей таблицы, как я могу сделать это для каждого столбца отдельно? Пожалуйста, помогите.

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

В том же духе, что и ответ @Joris, вот где замечательная функция sweep() вступает в свои права:

> sweep(x, MARGIN = 2, colMeans(abs(x)), "*")
       t0     t1    t2     t3   t4
aa  0.000  0.625  0.00  0.375  0.0
bb  0.625  0.000  0.75  0.000  0.5
cc  0.000  0.000  0.00  0.000  0.0
dd  0.625  0.625  0.75  0.000  0.5
ee  0.625  0.625  0.75  0.000  0.0
ff  0.000  0.000  0.75  0.000  0.5
gg -0.625 -0.625 -0.75 -0.375  0.0
hh -0.625  0.625 -0.75  0.375 -0.5

Что здесь происходит, так это то, что colMeans(abs(x)) - это вектор длины 5. Мы sweep() эти значения по столбцам (обозначенные MARGIN = 2 в вызове) над данными x, применяя функцию * как мы идем. Таким образом, значения в столбце t0 все умножаются на colMeans(abs(x))[1], значения в столбце t1 все умножаются на colMeans(abs(x))[2] и т. Д.

Преимущество sweep() состоит в том, что он очень быстрый, если задана матрица:

X <- data.matrix(x)
> system.time(replicate(1000, sweep(X, 2, means, "*")))
   user  system elapsed 
  0.115   0.000   0.118 
> system.time(replicate(1000, mapply(`*`, x, means)))
   user  system elapsed 
  0.308   0.001   0.309 
> system.time(replicate(1000, mapply(`*`, X, means)))
   user  system elapsed 
  0.204   0.000   0.205

Это намного медленнее, если задан кадр данных:

> system.time(replicate(1000, sweep(x, 2, means, "*")))
   user  system elapsed 
  2.072   0.000   2.074

Но так обстоит дело в R.

6 голосов
/ 28 апреля 2011

Попробуйте это:

> colMeans(abs(x))
   t0    t1    t2    t3    t4 
0.625 0.625 0.750 0.375 0.500 

для частот и

> mapply(`*`,x,colMeans(abs(x)))
         t0     t1    t2     t3   t4
[1,]  0.000  0.625  0.00  0.375  0.0
[2,]  0.625  0.000  0.75  0.000  0.5
[3,]  0.000  0.000  0.00  0.000  0.0
[4,]  0.625  0.625  0.75  0.000  0.5
[5,]  0.625  0.625  0.75  0.000  0.0
[6,]  0.000  0.000  0.75  0.000  0.5
[7,] -0.625 -0.625 -0.75 -0.375  0.0
[8,] -0.625  0.625 -0.75  0.375 -0.5

чтобы получить фрейм данных. mapply применяет функцию * к каждому столбцу, используя указанные аргументы. Смотри также ?mapply

...