【发布时间】:2019-02-10 18:47:53
【问题描述】:
我有一个包含 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)
等等。
问题
- 我不确定如何实现上述新数据帧。有人可以帮忙吗?
- 此外,我认为应用程序家族必须有一个更优雅的解决方案。有什么想法吗?
非常感谢您的帮助。
【问题讨论】:
-
你需要
lst1 <- lapply(my.list, function(x) cbind(my.data[1:2], my.data[grep(x, names(my.data))])); names(lst1) <- paste0("newdata", my.list); list2env(lst1, envir = .GlobalEnv)还是splitsplit.default(my.data[-(1:2)], sub(".*_", "", names(my.data)[-(1:2)])) -
嗨@akrun,非常感谢。第一个做我需要的!有没有办法在每个数据框中创建所有变量? (意思是在 1998 年的数据框中也有 z,所有值都是 NA?)
标签: r