基于数据框中的组ID计算标准偏差。

3
这与我之前的问题有关。我的最终目标是根据序列变量对项目进行排名,该变量是从一天的开始和结束的标准差值派生出的。简单概括一下,我想要计算它们(开始和结束的日期),然后如果标准偏差小于0.5,我想将其标记为1。在R中实现这个规则的最佳方法是什么?
在R中实现此规则的最佳方法是什么?
=IF(AND(STDEV.S(D2,D3,D4)<0.5,STDEV.P(E2, E3, E4)<0.5),1,0)

示例数据结构:

enter image description here

示例输出:

enter image description here

示例数据

df<-structure(list(serial = c(11011209, 11011209, 11011209, 11011209, 
11011209, 11011210, 11011210, 11011210, 11011210), pnum = c(1, 
1, 1, 2, 2, 2, 2, 2, 2), Day = c("Tue", "Wed", "Thur", "Wed", 
"Thur", "Mo", "Tue", "Wed", "Thur"), Start = c(7, 7, 7, 8, 8, 
9.75, 6.5, 6.5, 6.5), End = c(14.5, 14.5, 14.5, 15.75, 15.75, 
17.75, 14.75, 14.75, 8.75)), class = c("spec_tbl_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
    cols = list(serial = structure(list(), class = c("collector_double", 
    "collector")), pnum = structure(list(), class = c("collector_double", 
    "collector")), Day = structure(list(), class = c("collector_character", 
    "collector")), Start = structure(list(), class = c("collector_double", 
    "collector")), End = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))
1个回答

1

在按'serial'、'num'分组后,通过检查'Start'、'End'列的sd是否小于0.5并使用&将多个表达式连接为一个表达式来创建'Pattern'

library(dplyr)
df %>%
    group_by(serial, pnum) %>% 
    mutate(Pattern = +(sd(Start) < 0.5 & sd(End) < 0.5)) %>%
    ungroup

或者,可以使用if_all来代替单独指定每个列。

df %>%
    group_by(serial, pnum) %>%
    mutate(Pattern = +(if_all(c(Start, End), ~ sd(.) < 0.5))) %>%
    ungroup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接