在R中找到一个更简单的解决方案

时间:2014-12-12 14:25:07

标签: r

在包alr4中,是一个数据框,“Mitchell”有两列,一列是月号,另一列是该月的温度。月份表示为0,1,2,3 ... 203(表示1月,2月,3月,12月),其中月份12是次年1月。我正在尝试制作一个数据框,它在月份列中有1,1,1,... 2,2,2,......将这几个月组合在一起,温度列是上述进行的重新排序0,12,24,... 1,13,25,......

我决定分别制作两列,然后使用cbind将它们连接在一起:

#Making temperature column
NTemp <- subset(Mitchell$Temp, Mitchell$Month %% 12 == 0)
for(i in 1:11) {
  dummy <- subset(Mitchell$Temp, Mitchell$Month %% 12 == i)
  NTemp <- cbind(NTemp, dummy)
}

#Making months column (there's one observation every month for 17 years)
NMonth <- rep(1, 17)
for( i in 2:12 ) {
  NMonth <- c(NMonth, rep(i, 17))
}

#Put them together
NMitchell <- cbind(NMonth, NTemp)

我的问题是:

有更简单/更好的方法吗?很多时候我最近做了这样的短功能,我发现你可以做一个很好的一行,例如使用sapply。我在这里看不到我如何使用apply函数,但是你能看到什么好看的吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我会为NMonth添加一个列(Jan为1,2月为2等),并对(NMonth,Month)进行排序,以便按月对同一月份的观察进行排序。这是你想要的吗?

Mitchell$NMonth <- (Mitchell$Month %% 12)+1
NMitchell <- Mitchell[with(Mitchell,order(NMonth,Month)),]

答案 1 :(得分:0)

您可以使用富有表现力的dplyr

来实现
data(Mitchell, package = "alr4")
library(dplyr)
Mitchell %>%
  mutate(month = Month %% 12 + 1) %>%
  select(month, Temp) %>%
  arrange(month)