Как создать столбец с общим количеством экземпляров двоичного значения в R - PullRequest
1 голос
/ 16 октября 2019

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

Любая помощь будет высоко ценится. Я пытался сделать пару утверждений ifelse, так как я пришел из Excel и не знаю, что я делаю, но ничего не получил.

Начальный набор данных:

df<-data.frame(Point=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3),
        Possession=c(1,NA,1,NA,1,NA,NA,1,NA,NA,NA,1,NA,NA,NA,1,NA,NA))

Требуется вывод:

Point Possession Possessions in Point
1     1          1
1     NA         1
1     1          2
1     NA         2
1     1          3
1     NA         3
1     NA         3
2     1          1
2     NA         1
2     NA         1
2     NA         1
2     1          2
2     NA         2
3     NA         0
3     NA         0
3     1          1
3     NA         1
3     NA         1

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

В базе вы можете использовать ave в комбинации с cumsum, например:

df$"Possessions in Point"  <- ave(!is.na(df$Possession), df$Point, FUN=cumsum)
df
#   Point Possession Possessions in Point
#1      1          1                    1
#2      1         NA                    1
#3      1          1                    2
#4      1         NA                    2
#5      1          1                    3
#6      1         NA                    3
#7      1         NA                    3
#8      2          1                    1
#9      2         NA                    1
#10     2         NA                    1
#11     2         NA                    1
#12     2          1                    2
#13     2         NA                    2
#14     3         NA                    0
#15     3         NA                    0
#16     3          1                    1
#17     3         NA                    1
#18     3         NA                    1

Или, как предложено @Onyambu:

transform(df,"Possessions in Point" = ave(!is.na(Possession),Point,FUN = cumsum))

или

df$"Possessions in Point"  <- ave(replace(df$Possession, is.na(df$Possession), 0)
                                  , df$Point, FUN=cumsum)

или

df$"Possessions in Point"  <- ave(ifelse(is.na(df$Possession), 0, df$Possession)
                                  , df$Point, FUN=cumsum)
1 голос
/ 16 октября 2019

Вы можете использовать data.table пакет следующим образом:

library(data.table)
setDT(df)[, cumsum(nafill(Possession, fill = 0)), by = Point]

, если вы не найдете функцию nafill, вам следует обновить data.table пакет.

1 голос
/ 16 октября 2019

В этом решении используются dplyr и функции group_by(), а также cumsum().

. Это работает только в том случае, если мы конвертируем NA в 0, поскольку cumsum не может работать с NA. Если это проблема, вы можете использовать другое, но более сложное решение с условной суммой.

library(dplyr)
df<-data.frame(Point=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3),
        Possession=c(1,NA,1,NA,1,NA,NA,1,NA,NA,NA,1,NA,NA,NA,1,NA,NA))

df %>%
  group_by(Point) %>%
  mutate(Possession = case_when(is.na(Possession)~0,TRUE~Possession),Possession_in_Point = cumsum(Possession))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...