Суммирование столбца на основе значений других столбцов - PullRequest
0 голосов
/ 06 июня 2018

Я хотел бы суммировать значения одного столбца на основе значения другого столбца как можно более эффективно.Я не был уверен, есть ли способ использовать команду суммирования.Вот примерный набор данных:

Cancer1   Cancer2   Cancer3   Disease1
1         0         1         1
0         1         0         0
1         0         0         1 

В этом случае я рассчитываю суммировать заболевание1, основываясь на том, есть ли у человека данный рак.Я ищу выходные данные, в которых говорится, что общее число людей с раком 1 и заболеванием 1 равно 2, общее число людей с раком 2 и заболеванием 1 равно 0, а общее число людей с раком 3 и заболеванием 1 равно 1.

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Возможно, вы захотите взглянуть на dplyr::count().

# sum up the number of people that have Cancer1 and Disease1:
foo <- ds %>% count(Cancer1 , Disease1)

# extract the integer result you are looking for:
foo %>% filter(Cancer1 == 1, Disease1== 1) %>% pull(n)
0 голосов
/ 07 июня 2018

Вместо того, чтобы сразу переходить к коду-ответу, я хотел бы предложить несколько (незапрошенных) советов относительно форматирования данных:

Мне кажется, что вы могли бы извлечь большую выгоду из наличиядлинный стол вместо того, который у вас есть (у вас может быть много других типов рака, таких как "Cancer_n"; и много других болезней, таких как "AIDS_N").Для того, чтобы иметь длинную таблицу, вам может потребоваться определить какой-то идентификатор для каждой записи.Также для полноты результатов я бы хотел предложить решение data.table:

require(data.table) # loads the package

a <- data.table(id = 1:3, 
                Cancer1 = c(1,0,1), 
                Cancer2 = c(0,1,0), 
                Cancer3 = c(1, 0,0), 
                Disease1 = c(1,0,1)) # create a data.table with an additional id

# melt the data.table (make it long-form), and calculate the expected result:
melt(a, c("Disease1", "id"))[Disease1 == 1 & value == 1, .N, by = variable]

   variable N
1:  Cancer1 2
2:  Cancer3 1
0 голосов
/ 06 июня 2018

Мы можем создать переменную, используя rowSums в столбцах «Рак», а затем умножить на двоичный столбец «Болезнь»

df1$newCol <- (rowSums(df1[1:3] > 0)) * df1$Disease1
df1$newCol
#[1] 2 0 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...