#r #summary
#r #Краткие сведения
Вопрос:
У меня есть образец набора данных, подобный следующему. Я могу легко получить сводку отсюда.
a <- structure(list(Occ = c(1, 1, 2, 2, 3, 3, 4, 5, 5, 5),
Type = c("A", "B", "C", "A", "A", "A", "B", "C", "C", "B"),
Alc = c("A", "B", "N", "A", "N", "N", "N", "A", "B", "B"),
Count = c(10, 10, 20, 10, 15, 15, 10, 10, 20, 15)),
.Names = c("Occ", "Type", "Alc", "Count"), row.names = c(NA, -10L), class = "data.frame")
a$Occ <- factor(a$Occ)
a$Type <- factor(a$Type)
a$Alc<- factor(a$Alc)
a
Occ Type Alc Count
1 1 A A 10
2 1 B B 10
3 2 C N 20
4 2 A A 10
5 3 A N 15
6 3 A N 15
7 4 B N 10
8 5 C A 10
9 5 C B 20
10 5 B B 15
summary(a)
Occ Type Alc Count
1:2 A:4 A:3 Min. :10.0
2:2 B:3 B:3 1st Qu.:10.0
3:2 C:3 N:4 Median :12.5
4:1 Mean :13.5
5:3 3rd Qu.:15.0
Max. :20.0
Но я хочу получить сводку процентов на основе количества для каждой переменной, как показано ниже.
Occ Type Alc
1:14.9% A:37.1% A:22.2%
2:22.2% B:25.8% B:33.3%
3:22.2% C:37.1% N:44.5%
4:7.4%
5:38.3%
Любая помощь приветствуется.
Ответ №1:
Вот вам отправная точка. Вероятно, вам придется немного изменить в соответствии с вашими конкретными потребностями.
library(data.table)
dt = as.data.table(a)
for(b in names(dt)[1:3]) print(dt[, sum(Count), by = b][, V1 := 100*V1/sum(V1)])
# Occ V1
#1: 1 14.814815
#2: 2 22.222222
#3: 3 22.222222
#4: 4 7.407407
#5: 5 33.333333
# Type V1
#1: A 37.03704
#2: B 25.92593
#3: C 37.03704
# Alc V1
#1: A 22.22222
#2: B 33.33333
#3: N 44.44444
Ответ №2:
Лучшей базовой функцией для вычисления этих значений, вероятно, была бы xtabs
. Здесь я немного изменил форматирование, чтобы значение выглядело как процент
myfactors <- names(a)[sapply(a, is.factor)]
lapply(myfactors, function(f) {
round(xtabs(as.formula(paste0("Count~", f)), a)/sum(a$Count)*100,2)
})
это приведет к созданию списка таблиц
# [[1]]
# Occ
# 1 2 3 4 5
# 14.81 22.22 22.22 7.41 33.33
#
# [[2]]
# Type
# A B C
# 37.04 25.93 37.04
#
# [[3]]
# Alc
# A B N
# 22.22 33.33 44.44
Ответ №3:
require(Hmisc) # for wtd.table
sapply(
sapply(
sapply(a[1:3], wtd.table, a$Count, "table"),
"/", sum(a$Count)/100 ),
round, 1)
$Occ
1 2 3 4 5
14.8 22.2 22.2 7.4 33.3
$Type
A B C
37.0 25.9 37.0
$Alc
A B N
22.2 33.3 44.4
Голосование за два других ответа, которые выглядят лучше.