#r
#r
Вопрос:
Я отфильтровал данные, и один из столбцов имеет 5 уровней фактора, и я хочу получить сумму для каждого уровня фактора.
Я использую приведенный ниже код
levels(df_Temp$ATYPE)
[1] "a" "b" "c" "d" "Unknown"
Я использую приведенный ниже код
cast(df_Temp,ATYPE~AFTER_ADM, sum, value = "CHRGES")
но результат, который я получаю, выглядит следующим образом
ATYPE 0 1
1 a 0 2368968.39
2 b 0 3206567.47
3 c 0 19551.19
4 e 0 2528688.12
Я хочу указать все уровни факторов и суммировать как «0» для этих недостающих данных уровня факторов.
Итак, желаемый результат
ATYPE 0 1
1 a 0 2368968.39
2 b 0 3206567.47
3 c 0 19551.19
4 d 0 0
5 e 0 2528688.12
Комментарии:
1. это не работает
2. Попробуйте
xtabs(CHRGES ~ ATYPE AFTER_ADM, df_Temp)
3.
cast(df,ATYPE~AFTER_ADM, sum, value = "CHRGES", add.missing = TRUE)
использует ли командаreshape
Ответ №1:
Используя xtabs
из base R
xtabs(CHRGES ~ ATYPE AFTER_ADM, subset(df_Temp, ATYPE != "e"))
# AFTER_ADM
#ATYPE 0 1
# a 0.00000000 -5.92270971
# b -1.68910431 0.05222349
# c -0.26869311 0.16922669
# d 1.44764443 -1.59011411
# e 0.00000000 0.00000000
данные
set.seed(24)
df_Temp <- data.frame(ATYPE = sample(letters[1:5], 20, replace = TRUE),
AFTER_ADM = sample(0:1, 20, replace = TRUE), CHRGES = rnorm(20))
Ответ №2:
Если я правильно понимаю ваш вопрос, вы можете использовать dplyr
. Сначала я создал пример набора данных:
set.seed(123)
x <- sample(letters[1:5], 1e3, replace = T)
x[x == "e"] <- "Unknown"
y <- sample(1:100, 1e3, replace = T)
df1 <- data.frame(ATYPE = factor(x), AFTER_ADM = y)
df1$AFTER_ADM[df1$ATYPE == "Unknown"] <- NA
head(df1, 10)
ATYPE AFTER_ADM
1 b 28
2 d 60
3 c 17
4 Unknown NA
5 Unknown NA
6 a 48
7 c 78
8 Unknown NA
9 c 7
10 c 45
А затем используйте group_by
и суммируйте, чтобы получить сумму и подсчеты. Я не был уверен, хотите ли вы подсчеты для уровней фактора, но это легко удалить, если вам не интересно:
library(dplyr)
df1 %>%
group_by(ATYPE) %>%
summarise(sum_AFTER_ADM = sum(AFTER_ADM, na.rm = T),
n_ATYPE = n())
# A tibble: 5 x 3
ATYPE sum_AFTER_ADM n_ATYPE
<fct> <int> <int>
1 a 10363 198
2 b 11226 206
3 c 9611 203
4 d 9483 195
5 Unknown 0 198
Комментарии:
1. сработало хорошо, но я использовал код одной строки
xtabs(CHRGES ~ ATYPE AFTER_ADM, df_Temp)
в качестве окончательного кода. Спасибо
Ответ №3:
Другое возможное решение с использованием dplyr
и tidyr
. Использование count и complete из двух пакетов поможет решить вашу проблему.
library(dplyr)
library(tidyr)
#using iris as toy data
iris2 <- iris %>%
filter(Species != "setosa")
#count data and then fill n with 0
ir3 <- count(iris2, Species) %>%
complete(Species, fill = list(n =0))
Комментарии:
1. сработало хорошо, но я использовал код одной строки
xtabs(CHRGES ~ ATYPE AFTER_ADM, df_Temp)
в качестве окончательного кода. Спасибо