【问题标题】:Calculate probability and consecutive events in a dataframe计算数据框中的概率和连续事件
【发布时间】:2020-11-11 14:49:17
【问题描述】:

我的数据集有 575 行和 368 列,如下所示:

   NUTS3_2016 URAU_CODE FUA_CODE  X2018.01.01.x X2018.01.02.x X2018.01.03.x    ...
1      AT130   AT001C1  AT001L3    0.46369280     0.3582241     0.2777274      ...
2      AT211   AT006C1  AT006L2   -0.04453125    -0.3092773    -0.3284180      ...
3      AT312   AT003C1  AT003L3    1.02993164     0.9640137     0.6413086      ...
4      AT323   AT004C1  AT004L3    1.21105239     1.4335363     1.2400620      ... 
...    ...      ....    ...            ...            ...           ....       ...

我想计算每行 x>2.5 的概率。

我还想计算每行有多少连续天 x 保持 >2.5。

你有什么建议?

非常感谢


尝试:

A <- c("a", "b", "c", "d", "e")
B <- c(1:5) 
C <- c(1:5)
x <- data.frame(A,B,C) 
x$prob <- rowMeans(x[-(1)]>2)
x
#   A B C prob
# 1 a 1 1    0
# 2 b 2 2    0
# 3 c 3 3    1
# 4 d 4 4    1
# 5 e 5 5    1

【问题讨论】:

  • rowMeans(data[-(1:3)]&gt;2.5)
  • rowMeans 不是只计算每一行的总和和均值吗?
  • 逻辑变量的比例被计算为均值
  • 我觉得少了点什么。试试这个A &lt;- c("a", "b", "c", "d", "e") B &lt;- c(1:5) C &lt;- c(1:5) x &lt;- data.frame(A,B,C) x$prob &lt;- rowMeans(x[-(1)]&gt;2) 在最后三行prob 应该等于1。
  • 大多数编程语言中的“计数”是通过对逻辑求和来完成的。计算比例是取逻辑的平均值。请注意,Onyambu 的建议是rowMeans( data[-(1:3)] &gt; 2.5 ),而不是rowMeans(data[-(1:3)])。试试看!

标签: r dataframe probability


【解决方案1】:

我们可以使用rle 来查找最大条纹的长度。

## Some sample data:
set.seed(47)
data = matrix(rnorm(24, mean = 2.5), nrow = 3)
data = cbind(ID = c("A", "B", "C"), as.data.frame(data))
data
#   ID       V1       V2       V3       V4        V5       V6        V7       V8
# 1  A 4.494696 2.218235 1.514518 1.034250 2.9938202 3.170779 1.7966118 2.749148
# 2  B 3.211143 2.608776 2.515131 1.577544 0.6717708 2.418922 2.4594218 2.159584
# 3  C 2.685405 1.414263 2.247954 2.539602 2.5914729 3.764241 0.9338379 2.917191

data$max_streak = apply(data[-1], 1, function(x) with(rle(x > 2.5), max(lengths[values])))
# ID       V1       V2       V3       V4        V5       V6        V7       V8   max_streak
# 1  A 4.494696 2.218235 1.514518 1.034250 2.9938202 3.170779 1.7966118 2.749148          2
# 2  B 3.211143 2.608776 2.515131 1.577544 0.6717708 2.418922 2.4594218 2.159584          3
# 3  C 2.685405 1.414263 2.247954 2.539602 2.5914729 3.764241 0.9338379 2.917191          3

【讨论】:

  • 感谢格雷戈尔。一年多后,我发现自己再次为这段代码苦苦挣扎。当我们将条件应用于列时是否相同?例如:data$mean &lt;- apply(data[-1],1,mean),然后是data$max_streak = apply(data[-1], 1, function(x) with(rle(x &gt; data$mean), max(lengths[values])))
  • 我不太明白你的评论。 apply 的第二个参数是 MARGINMARGIN = 1 将函数应用于行,MARGIN = 2 将函数应用于列。如果要将函数应用于不能使用相同代码的列,则需要将MARGIN = 1 更改为MARGIN = 2
  • 请参考我刚刚打开的问题:stackoverflow.com/questions/70451296/…
猜你喜欢
  • 2019-08-17
  • 1970-01-01
  • 2022-01-07
  • 2017-12-05
  • 1970-01-01
  • 2019-02-04
  • 2017-06-05
  • 2021-04-29
  • 2016-10-15
相关资源
最近更新 更多