gpt4 book ai didi

r - 计算 R 中数据框中每一行的前导和尾随零

转载 作者:行者123 更新时间:2023-12-05 08:46:48 24 4
gpt4 key购买 nike

我正在尝试分析一个数据框,其中每一行都代表一个时间序列。我的 df 结构如下:

df <- data.frame(key = c("10A", "11xy", "445pe"), 
Obs1 = c(0, 22, 0),
Obs2 = c(10, 0, 0),
Obs3 = c(0, 3, 5),
Obs4 = c(0, 10, 0)
)

我现在想创建一个新的数据框,其中每一行再次代表键,列由以下结果组成:

  1. “TotalZeros”:计算每行零的总数 (=key)
  2. “LeadingZeros”:计算每行第一个非零 obs 之前的零数

这意味着我希望最终收到以下数据帧:

key   TotalZeros   LeadingZeros
10A 3 1
11xy 1 0
445pe 3 2

我设法计算了每一行零的总数:

zeroCountDf <- data.frame(key = df$key, TotalNonZeros = rowSums(df ! = 0))

但我正在努力计算 LeadingZeros。我找到了如何计算向量中的第一个非零位置,但我不明白如何将这种方法应用于我的数据框:

vec <- c(0,1,1)
min(which(vec != 0)) # returns 2, meaning the second position is first nonzero value

谁能解释如何计算数据框中每一行的前导零?我是 R 的新手,感谢任何见解和提示。提前致谢。

最佳答案

我们可以使用 matrixStats 中的 rowCumsumsrowSums

library(matrixStats)
cbind(df[1], total_zeros = rowSums(df[-1] == 0),
Leading_zeros = rowSums(!rowCumsums(df[-1] != 0)))

-输出

     key total_zeros Leading_zeros
1 10A 3 1
2 11xy 1 0
3 445pe 3 2

或者在 tidyverse 中,我们也可以使用 rowwise

library(dplyr)
df %>%
mutate(total_zeros = rowSums(select(., starts_with("Obs")) == 0)) %>%
rowwise %>%
transmute(key, total_zeros,
Leading_zeros = sum(!cumsum(c_across(starts_with('Obs')) != 0))) %>%
ungroup

-输出

# A tibble: 3 x 3
key total_zeros Leading_zeros
<chr> <dbl> <int>
1 10A 3 1
2 11xy 1 0
3 445pe 3 2

关于r - 计算 R 中数据框中每一行的前导和尾随零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69016870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com