У меня есть этот фрейм данных:
> set.seed(100)
> df <- data.frame(X1 = sample(c(1:7, NA), 10, replace=TRUE),
X2 = sample(c(1:7, NA), 10, replace=TRUE),
X3 = sample(c(1:7, NA), 10, replace=TRUE),
YY = sample(c("a","b"), 10, replace=TRUE),
stringsAsFactors = FALSE)
> df
X1 X2 X3 YY
1 3 5 5 a
2 3 NA 6 b
3 5 3 5 a
4 1 4 6 b
5 4 7 4 b
6 4 6 2 b
7 7 2 7 a
8 3 3 NA b
9 5 3 5 b
10 2 6 3 a
Где конечный результат такой:
YY X1 X2 X3
a -0.25 -0.25 0
b -0.83 -0.2 0
Формула для каждого процента:
(counts of c(6,7)
- counts of c(1,2,3,4)
) / counts of c(1,2,3,4,5,6,7)
. Например, чтобы получить -0.5
для X1
и a
:
Where the columns is `X1` and `YY = a`, then:
prom = counts of c(6,7) = 1
detr = counts of c(1,2,3,4) = 4
total = counts of c(1,2,3,4,5,6,7) = 6
The percentage is (prom - detr) / total = (1-4)/ 6 = -0.5
И я пытаюсь добиться этого вывода через цикл в каждом столбце (X1,X2, and X3
), где для каждого столбца:
> table(df[,X1], df$YY)
a b
1 0 1
2 1 0
3 1 2
4 0 2
5 1 1
7 1 0
И суммируйте соответствующие числа для a
и b
. Но я изо всех сил пытаюсь получить доступ к этим table()
и, для каждого YY
, суммировать соответствующие подсчеты, сложить их и разделить их на общее количество подсчетов. Я думал о том, чтобы получить доступ к таблице и суммировать по критериям с помощью expss::sum_if()
, но я до сих пор не нашел пути.
Есть ли более простой способ сделать это? Любая идея?. Я также пробовал использовать dplyr, но это кажется более сложным, когда мне нужно сгруппировать по категориям и подсчитать, суммировать и разделить по столбцам и закончить с этим небольшим выводом.