使用循环或替代方法来避免重复的代码行

时间:2019-07-26 08:22:29

标签: r

我有一个名为TAS1的数据帧,如下所示:

TAS1     2000 obs. of 9862 variables

colnames(TAS1)=c(seq(as.Date('1979-01-01'), as.Date('2005-12-31'), by = 1))

9862变量(列)代表每日温度,然后我希望将其分成一年中每个月的十二个单独的数据框。以下代码可以做到这一点:

TAS1.JAN = subset(TAS1, select=(grepl("-01-", colnames(TAS1))))
TAS1.FEB = subset(TAS1, select=(grepl("-02-", colnames(TAS1))))
TAS1.MAR = subset(TAS1, select=(grepl("-03-", colnames(TAS1))))
TAS1.APR = subset(TAS1, select=(grepl("-04-", colnames(TAS1))))
TAS1.MAY = subset(TAS1, select=(grepl("-05-", colnames(TAS1))))
TAS1.JUN = subset(TAS1, select=(grepl("-06-", colnames(TAS1))))
TAS1.JUL = subset(TAS1, select=(grepl("-07-", colnames(TAS1))))
TAS1.AUG = subset(TAS1, select=(grepl("-08-", colnames(TAS1))))
TAS1.SEP = subset(TAS1, select=(grepl("-09-", colnames(TAS1))))
TAS1.OCT = subset(TAS1, select=(grepl("-10-", colnames(TAS1))))
TAS1.NOV = subset(TAS1, select=(grepl("-11-", colnames(TAS1))))
TAS1.DEC = subset(TAS1, select=(grepl("-12-", colnames(TAS1))))

虽然这段代码显然是非常重复的,但我知道上面的代码应该可以在一两行内执行。我仍然是一个非常幼稚的程序员。我知道我应该使用循环或类似的东西,但不知道如何为这样的简单代码改编循环。任何建议都非常欢迎。

1 个答案:

答案 0 :(得分:1)

通过从列名中提取月份来使用split.default

list1 <- split.default(df, sub(".*-(\\d+)-.*", "\\1", names(df)))

您还可以使用format根据月份进行拆分。

list1 <- split.default(df, format(as.Date(names(df)), "%m"))

它将为您提供12个数据帧的列表,可以分别使用list1[[1]]list1[[2]]等进行提取。