首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于列表中数据的文件名的大列表中的子集数据

基于列表中数据的文件名的大列表中的子集数据
EN

Stack Overflow用户
提问于 2020-03-30 08:39:24
回答 1查看 48关注 0票数 0

我正在处理一个包含450个数据文件的大列表。我将给出一个名称的例子-- dataframes

代码语言:javascript
运行
复制
ALL_SM51_SE1_hourly, ALL_SM201_SE1_hourly, ALL_SM501_SE1_hourly
ALL_SM51_SE2_hourly, ALL_SM201_SE2_hourly, ALL_SM501_SE2_hourly
...................................................................
ALL_SM51_SE150_hourly, ALL_SM201_SE150_hourly, ALL_SM501_SE150_hourly

这些数据包含在不同深度(5cm、20 5cm、50 5cm、以"SM51、SM201、SM501“表示的文件名)的实测土壤湿度数据,还有150传感器(由"SE1,SE2,SE3,.在文件名中),这就是为什么我有450个数据文件存储在一个列表中。

我想做的是:我想为每个传感器创建一个新的列表(做一个子集),然后包含3个元素。所以我想要一个SE1,SE2,SE3,.,SE150的列表,和相应的测量深度。

我已经为我的问题寻找了一个合适的答案,但我只找到了这个子集数据的特定值的答案,但是,我想按文件名进行子集。

有人知道怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 09:24:37

使用正则表达式,您可以确定唯一的传感器un.se,您可以pastenew.names。最初的列表lst然后可以被split转换成唯一的传感器,ordered并转换成data.frame的。

代码语言:javascript
运行
复制
un.se <- gsub(".*SE(\\d+).*", "\\1", names(lst))
new.names <- paste0("SE", unique(un.se))
tmp <- setNames(split(lst, un.se), paste0("SE", unique(un.se)))
res <- lapply(tmp, function(x) {
  nm <- gsub(".*SM(\\d+).*", "\\1", names(x))
  setNames(lapply(x[order(nm)], data.frame), paste0("d", gsub("1$", "", nm)))
  })

解释gsub_-正则表达式:

在regex中,.*查找任何“字符-直到”,然后我们有字面上的SE。现在,我们在圆括号( )中使用分组,在这里我们使用\\d+查找一个或多个数字或digit的出现。在第二个gsub中,-argument \\1对第一个组(括号中的组)执行反向引用,以替换整个字符串。例如,结果un.se是在每个字符串中的每个SE后面找到的数字(参见:https://regex101.com/r/zuO8Ts/1;并注意,我们需要在R中使用双转义\\ )。

这将列出每个传感器和子列表中每个深度的数据帧。

结果

代码语言:javascript
运行
复制
res
# $SE1
# $SE1$d5
#   x1 x2 x3
# 1  1  2  3
# 
# $SE1$d20
#   x1 x2 x3
# 1  1  2  3
# 
# $SE1$d50
#   x1 x2 x3
# 1  1  2  3
# 
# 
# $SE2
# $SE2$d5
#   x1 x2 x3
# 1  1  2  3
# 
# $SE2$d20
#   x1 x2 x3
# 1  1  2  3
# 
# $SE2$d50
#   x1 x2 x3
# 1  1  2  3

玩具数据

代码语言:javascript
运行
复制
lst <- list(ALL_SM51_SE1_hourly = list(x1 = 1, x2 = 2, x3 = 3), ALL_SM201_SE1_hourly = list(
    x1 = 1, x2 = 2, x3 = 3), ALL_SM501_SE1_hourly = list(x1 = 1, 
    x2 = 2, x3 = 3), ALL_SM51_SE2_hourly = list(x1 = 1, x2 = 2, 
    x3 = 3), ALL_SM201_SE2_hourly = list(x1 = 1, x2 = 2, x3 = 3), 
    ALL_SM501_SE2_hourly = list(x1 = 1, x2 = 2, x3 = 3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60926815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档