R语言中如何按grp前缀拆分数据框为on和off子集?
解决方案
你的问题出在直接用精确匹配尝试匹配通配符格式的字符串:subset(data, grp= 'on_*')里的=是赋值操作(正确的比较应该用==),而且就算改成==,'on_*'是一个固定字符串,你的grp列里没有这个值,同时*在这里不是正则通配符,无法匹配on_1、on_3这类格式的内容。
下面是几种可行的实现方式:
方法1:用grepl结合subset筛选
利用正则表达式匹配grp列的开头字符,筛选出目标行后提取duration列并转为数据框:
# 提取on开头的子集 data_on <- data.frame(duration = subset(data, grepl("^on_", grp))$duration) # 提取off开头的子集 data_off <- data.frame(duration = subset(data, grepl("^off_", grp))$duration)
grepl("^on_", grp):返回逻辑向量,标记grp列中以on_开头的行subset(...):根据逻辑向量筛选行,再提取duration列,最后用data.frame()保持数据框格式
方法2:直接用逻辑索引筛选
不依赖subset,直接通过逻辑索引定位目标行:
data_on <- data[grepl("^on_", data$grp), "duration", drop = FALSE] data_off <- data[grepl("^off_", data$grp), "duration", drop = FALSE]
drop = FALSE:确保结果保持数据框格式,而不是转为向量
方法3:先提取前缀再筛选
先从grp列中提取on/off前缀,再根据前缀筛选:
# 提取grp的前缀(去掉_及后面的内容) data$prefix <- sub("_.*", "", data$grp) # 筛选并提取duration列 data_on <- data[data$prefix == "on", "duration", drop = FALSE] data_off <- data[data$prefix == "off", "duration", drop = FALSE]
sub("_.*", "", data$grp):用正则替换掉_及之后的所有字符,得到前缀on或off
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

