Вычислить, сколько раз 0 меняется на 1 в одной строке в нескольких столбцах

У меня есть данные о присутствии-отсутствии на нескольких сайтах и ​​за годы, которые выглядят примерно так:

df <- tibble(Site = c("A","B","C","D","E"), 
                "1999"=c(0,NA,1,NA,1),
                "2000"=c(1,NA,NA,0,1),
                "2001"=c(NA,0,1,NA,0),
                "2002"=c(NA,1,NA,1,0),
                "2003"=c(0,NA,0,1,NA)
                 )

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

Я понимаю, как добавлять столбцы в конце кадра данных и получать сводную статистику по всем строкам. например.,

## Group input by rows
rowwise(df)

## Add column called "0t1" (to contain the number of times a 0 changed to a 1) and sum across all columns starting with the "19" column, ignoring NAs
df %>%  mutate("0t1" = sum(across(starts_with("19")),na.rm=T))

Однако это, конечно, просто дает мне сумму количества значений в каждой строке.

  Site  `1999` `2000` `2001` `2002` `2003` `0t1`
  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
1 A          0      1     NA     NA      0     2
2 B         NA     NA      0      1     NA     2
3 C          1     NA      1     NA      0     2
4 D         NA      0     NA      1      1     2
5 E          1      1      0      0     NA     2

Сейчас я не могу понять, как вычислить значения, зависящие от значения в предыдущей ячейке, отличной от NA, что даст что-то похожее на это:

  Site  `1999` `2000` `2001` `2002` `2003` `0t1`  `1t0`
  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>  <dbl>
1 A          0      1     NA     NA      0     1    1
2 B         NA     NA      0      1     NA     1    0
3 C          1     NA      1     NA      0     0    1
4 D         NA      0     NA      1      1     1    0
5 E          1      1      0      0     NA     0    1

Если вы сделаете starts_with("19"), будет только один столбец с этим

akrun 26.12.2020 19:19

Я думал, что «starts_with» — это просто команда, указывающая, с какого столбца начинать. Похоже, это то, что он делает, потому что сумма по всей строке в сумме составляет 2, поэтому он должен просматривать все столбцы, а не только первый... верно?

Oscar Henry 26.12.2020 19:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь мы можем использовать lead для создания условия после удаления элементов NA в каждой строке (na.omit). Условие состоит в том, чтобы проверить текущее значение как 0, а следующее как 1 и взять sum

 apply(df[,-1], 1, function(x) {x1 <- na.omit(x); sum(x1 == 0 & lead(x1) == 1, na.rm = TRUE)})

Или то же самое с dplyr

library(dplyr)
df %>%
     rowwise %>%
     mutate(t1 = {x1 <- na.omit(c_across(where(is.numeric)))
                  sum(x1 == 0 & lead(x1) ==1, na.rm = TRUE)
              }) %>%
     ungroup

-выход

# A tibble: 5 x 7
#  Site  `1999` `2000` `2001` `2002` `2003`    t1
#  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <int>
#1 A          0      1     NA     NA      0     1
#2 B         NA     NA      0      1     NA     1
#3 C          1     NA      1     NA      0     0
#4 D         NA      0     NA      1      1     1
#5 E          1      1      0      0     NA     0

Другие вопросы по теме