Я отфильтровал данные, и один из столбцов имеет 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
Попробуйте xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp)
cast(df,ATYPE~AFTER_ADM, sum, value = "CHRGES", add.missing = TRUE)
— это команда, использующая reshape
Если я правильно понял ваш вопрос, вы можете использовать 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
работало хорошо, но я использовал однострочный код xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp)
в качестве окончательного кода. Спасибо
Использование 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))
Другое возможное решение с использованием 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))
работало хорошо, но я использовал однострочный код xtabs(CHRGES ~ ATYPE + AFTER_ADM, df_Temp)
в качестве окончательного кода. Спасибо
это не работает