R语言如何基于let列的字母条件提取对应High、Low列数值?
解决方法
你要的效果可以直接用tidyr::pivot_wider(长表转宽表)实现,不需要手动逐个定义变量,自动按let列的字母匹配取值,缺失时段自动填充NA,不会丢弃任何日期:
# 加载依赖包 library(tidyverse) # 长表转宽表 df_wide <- df %>% pivot_wider( id_cols = day_month, names_from = let, values_from = c(High, Low), # 自定义列名格式,直接生成high_A、low_a这种符合要求的变量名 names_glue = "{tolower(.value)}_{.name}" )
如果确实想沿用手动 summarise的写法,避免丢行的话,需要给取值加默认NA,替换你的subset写法即可:
df_2 <- df %>% group_by(day_month) %>% summarise( high_A = first(High[let == "A"], default = NA), low_A = first(Low[let == "A"], default = NA), # 其余变量按同样格式写即可 .groups = "drop" )
之前方法的问题说明
- 按行号用
nth取值:如果某日期缺失了部分时段,行号对应关系就会错乱,取到的是错误时段的数值 - 用
subset取值:当某日期没有对应字母的时段时,subset返回长度为0的空向量,summarise会直接丢弃该日期分组,导致日期缺失
内容的提问来源于stack exchange,提问作者Pastor Soto
相关产品推荐
相关产品推荐

