r - 在 R 中使用相似的变量名称,将大数据帧拆分/子集为多个较小的数据帧
问题描述
我有一个包含 300 多个变量的数据集,其方式如下:
创建示例数据:
id <- c('a','b','c', 'd', 'e', 'f')
type <- c(1,2,3,1,2,3)
x_97 <- c(1,2,3,4,5,6)
y_97 <- c('q','w','r','t', 'y', 'i')
z_97 <- c(80,90,70,50,60,40)
x_98 <- c(7,8,9,4,5,6)
y_98 <- c('y', 'i', 'r','t','q','w')
x_99 <- c(4,5,5,6,1,2)
z_99 <- c(20,10,40,50,20,50)
w_99 <- c(8,9,7,4,5,NA)
my.data <- data.frame(id, type, x_97, y_97, z_97, x_98, y_98, x_99, z_99)
请注意:_97、_98、_99 是 1997、1998 和 1999 年。
预期结果:
我想根据 id 和 type 将这个大数据框按年拆分为 3 个较小的数据框。
初步想法:
我正在创建一个列表:
my.list <- c("_97", "_98", "_99")
现在我想写这样的东西:
newdata97 <- subset(my.data, all variables with the 1st object of my.list)
newdata98 <- subset(my.data, all variables with the 2nd object of my.list)
等等。
问题
- 我不确定如何实现上面的 newdata 帧。有人可以帮忙吗?
- 此外,我认为应用程序家族必须有一个更优雅的解决方案。任何的想法?
非常感谢您的帮助。
解决方案
我们可以使用循环遍历'my.list',grep
用来提取与'my.list'中的子串匹配的列名,cbind
用前两列创建list
一个data.frames
lst1 <- lapply(my.list, function(x) cbind(my.data[1:2],
my.data[grep(x, names(my.data))]))
如果 'x', 'y', 'z' 中的一列缺失,则可以将其分配给NA
lst1 <- lapply(lst1, function(x) {nm1 <- setdiff(paste0(c('x', 'y',
'z'), substring(names(x)[3], 2)), names(x)[-(1:2)]); x[nm1] <- NA; x})
或者不是稍后创建列,而是在“my.data”中创建 NA 列
my.data[setdiff(paste0(rep(c("x_", "y_", "z_"), each = 3),
97:99), names(my.data)[-(1:2)])] <- NA
然后grep
像上面那样使用来创建一个list
data.frames
或者另一个选项是split
基于列名的子字符串
lst1 <- lapply(split.default(my.data[-(1:2)],
sub(".*_", "", names(my.data)[-(1:2)])), function(x) cbind(my.data[1:2], x))
最好将其保留为list
,但如果我们需要全局环境中的单个 data.frames,则命名list
元素并使用list2env
(虽然不推荐)
names(lst1) <- paste0("newdata", substring(my.list, 2))
list2env(lst1, envir = .GlobalEnv)
推荐阅读
- vue.js - 如何将输入字段动态添加到表单
- kubernetes - Istio 已部署但未显示在 GKE UI 中
- javascript - 一些图像未在 iOS 设备/模拟器 Ionic v1 上加载,但在浏览器中运行良好
- intellij-idea - Inellij 显示意图操作在 Flutter 中停止工作
- npm - npm install gulp-cli 失败 - 503 服务不可用
- javascript - 路由参数更改时刷新组件
- angular - 从子组件更新 ng-template
- ios - 如何在 Catalina 中访问“iTunes 共享”文件?
- aws-lambda - Skill Flow Builder Lambda 函数重置 DynamoDB
- iis - 您可以使用 URL_Rewrite rewritemaps 来修改 IIS 中的 ServerVariables 吗?