Отдельный столбец на два раздела внутри фрейма данных в R - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 2 вектора, и я хочу создать таблицу, которая сравнивает ожидаемое значение и дисперсию (гамма-распределения).

a <- c(0.1,0.5,1,2,5,10,100)
b <- c(0.1,0.5,1,2,5,10,100)
q3 <- matrix(NA,
             nrow=7,
             ncol=7,
             dimnames=list(
             (colnames=a),
             (rownames=b)
                )
                )
for(m in 1:7)
{
  for(n in 1:7)
  {
    q3[m,n]<-paste((a[m]/b[n]),(a[m]/b[n]^2))
  }
}
as.data.frame(q3)

Это дает

           0.1     0.5       1          2          5         10         100
0.1       1 10 0.2 0.4 0.1 0.1 0.05 0.025 0.02 0.004 0.01 0.001 0.001 1e-05
0.5       5 50     1 2 0.5 0.5 0.25 0.125   0.1 0.02 0.05 0.005 0.005 5e-05
1       10 100     2 4     1 1   0.5 0.25   0.2 0.04   0.1 0.01  0.01 1e-04
2       20 200     4 8     2 2      1 0.5   0.4 0.08   0.2 0.02  0.02 2e-04
5       50 500   10 20     5 5   2.5 1.25      1 0.2   0.5 0.05  0.05 5e-04
10    100 1000   20 40   10 10      5 2.5      2 0.4      1 0.1   0.1 0.001
100 1000 10000 200 400 100 100      50 25       20 4       10 1      1 0.01

Я хотел пометить каждый столбец внутри столбцов как E (x) и Var (x), сохраняя при этом имена столбцов, я не конечно, если это действительно возможно, или если я просто выберу другой подход. edit:

 E(x)V(x)0.1 E(x)V(x)0.5 E(x)V(x)1 E(x)V(x)2 E(x)V(x)5 E(x)V(x)10 E(x)V(x)100
0.1       1 10 0.2 0.4 0.1 0.1 0.05 0.025 0.02 0.004 0.01 0.001 0.001 1e-05
0.5       5 50     1 2 0.5 0.5 0.25 0.125   0.1 0.02 0.05 0.005 0.005 5e-05
1       10 100     2 4     1 1   0.5 0.25   0.2 0.04   0.1 0.01  0.01 1e-04
2       20 200     4 8     2 2      1 0.5   0.4 0.08   0.2 0.02  0.02 2e-04
5       50 500   10 20     5 5   2.5 1.25      1 0.2   0.5 0.05  0.05 5e-04
10    100 1000   20 40   10 10      5 2.5      2 0.4      1 0.1   0.1 0.001
100 1000 10000 200 400 100 100      50 25       20 4       10 1      1 0.01

Вот как бы я хотел, чтобы это выглядело, я знаю, что могу просто изменить имена столбцов, но я хочу, чтобы каждый столбец был назначен E (x) et c.

Нужно ли создавать фрейм данных с вдвое большим количеством столбцов?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Да, вы можете просто улучшить вызов функции paste () следующим образом:

for(m in 1:7)
{
  for(n in 1:7)
  {
    q3[m,n]<-paste("E(x)=", a[m]/b[n], "Var(x)=", a[m]/b[n]^2)
  }
}
as.data.frame(q3)

Вывод

                         0.1                   0.5                     1                        2
0.1       E(x)= 1 Var(x)= 10 E(x)= 0.2 Var(x)= 0.4 E(x)= 0.1 Var(x)= 0.1 E(x)= 0.05 Var(x)= 0.025
0.5       E(x)= 5 Var(x)= 50     E(x)= 1 Var(x)= 2 E(x)= 0.5 Var(x)= 0.5 E(x)= 0.25 Var(x)= 0.125
1       E(x)= 10 Var(x)= 100     E(x)= 2 Var(x)= 4     E(x)= 1 Var(x)= 1   E(x)= 0.5 Var(x)= 0.25
2       E(x)= 20 Var(x)= 200     E(x)= 4 Var(x)= 8     E(x)= 2 Var(x)= 2      E(x)= 1 Var(x)= 0.5
5       E(x)= 50 Var(x)= 500   E(x)= 10 Var(x)= 20     E(x)= 5 Var(x)= 5   E(x)= 2.5 Var(x)= 1.25
10    E(x)= 100 Var(x)= 1000   E(x)= 20 Var(x)= 40   E(x)= 10 Var(x)= 10      E(x)= 5 Var(x)= 2.5
100 E(x)= 1000 Var(x)= 10000 E(x)= 200 Var(x)= 400 E(x)= 100 Var(x)= 100      E(x)= 50 Var(x)= 25
                           5                       10                       100
0.1 E(x)= 0.02 Var(x)= 0.004 E(x)= 0.01 Var(x)= 0.001 E(x)= 0.001 Var(x)= 1e-05
0.5   E(x)= 0.1 Var(x)= 0.02 E(x)= 0.05 Var(x)= 0.005 E(x)= 0.005 Var(x)= 5e-05
1     E(x)= 0.2 Var(x)= 0.04   E(x)= 0.1 Var(x)= 0.01  E(x)= 0.01 Var(x)= 1e-04
2     E(x)= 0.4 Var(x)= 0.08   E(x)= 0.2 Var(x)= 0.02  E(x)= 0.02 Var(x)= 2e-04
5        E(x)= 1 Var(x)= 0.2   E(x)= 0.5 Var(x)= 0.05  E(x)= 0.05 Var(x)= 5e-04
10       E(x)= 2 Var(x)= 0.4      E(x)= 1 Var(x)= 0.1   E(x)= 0.1 Var(x)= 0.001
100       E(x)= 20 Var(x)= 4       E(x)= 10 Var(x)= 1      E(x)= 1 Var(x)= 0.01

Проблема с этой формой заключается в том, что она не поддается лечению. Это хорошо только для отображения вывода. Идеальным вариантом является сохранение значений в виде сущностей, имеющих свои собственные столбцы или в формате tidy .

Так что лучшей идеей будет создание столбцов E (0.1), E (0.5) , ... и Var (0.1), Var (0.5), et c или другие имена, которые вам могут понравиться. Это сэкономит место в ваших выходных данных и сохранит возможность обработки столбцов.

1 голос
/ 18 марта 2020

Мы можем использовать outer для этого

m1 <- outer(a, b, FUN =  function(x, y) paste(x/y, x/y^2))
dimnames(m1) <- list(row.names(q3), paste0("E(x)V(x) ", colnames(q3)))
as.data.frame(m1)
#    E(x)V(x) 0.1 E(x)V(x) 0.5 E(x)V(x) 1 E(x)V(x) 2 E(x)V(x) 5 E(x)V(x) 10 E(x)V(x) 100
#0.1         1 10      0.2 0.4    0.1 0.1 0.05 0.025 0.02 0.004  0.01 0.001  0.001 1e-05
#0.5         5 50          1 2    0.5 0.5 0.25 0.125   0.1 0.02  0.05 0.005  0.005 5e-05
#1         10 100          2 4        1 1   0.5 0.25   0.2 0.04    0.1 0.01   0.01 1e-04
#2         20 200          4 8        2 2      1 0.5   0.4 0.08    0.2 0.02   0.02 2e-04
#5         50 500        10 20        5 5   2.5 1.25      1 0.2    0.5 0.05   0.05 5e-04
#10      100 1000        20 40      10 10      5 2.5      2 0.4       1 0.1    0.1 0.001
#100   1000 10000      200 400    100 100      50 25       20 4        10 1       1 0.01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...