У меня есть данные о присутствии-отсутствии на нескольких сайтах и за годы, которые выглядят примерно так:
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» — это просто команда, указывающая, с какого столбца начинать. Похоже, это то, что он делает, потому что сумма по всей строке в сумме составляет 2, поэтому он должен просматривать все столбцы, а не только первый... верно?
Здесь мы можем использовать 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
Если вы сделаете
starts_with("19")
, будет только один столбец с этим