基于变量和的R数据帧

问题描述 投票:0回答:2

我创建了以下变量。每个代表一个月。例如。 .arg1表示4月,.arg2表示5月,依此类推。

.arg1<-4
.arg2<-32
.arg3<-41
.arg4<-35
.arg5<-26
.arg6<-19
.arg7<-16
.arg8<-18
.arg9<-12
.arg10<-0
.arg11<-0
.arg12<-0

所有变量的总和为203。所以我的数据行是203。我已经创建了Month列。

我在那儿有分类月份的名字。例如。 .arg1 = 4。这意味着第1到第4行的“月份”列中的值将称为“ Apr”。当我在.arg变量之间的值为零时,就会出现问题。 在执行以下脚本时,默认情况下会创建Mar。即使它的值为0。

maxrows <- (.arg1 + .arg2+.arg3 + .arg4 + .arg5 + .arg6  + .arg7 + .arg8+ .arg9 + .arg10 + .arg11 + .arg12 )

m <- matrix(0, ncol = 1, nrow = maxrows)
m <- data.frame(m)
names(m)[1] <- 'Month'
m[1:.arg1,1] <- 'Apr'
m[(.arg1+1):(.arg2+.arg1),1] <- 'May'
m[(.arg2+.arg1+1 ):(.arg2+.arg1+.arg3),1] <- 'Jun'
m[(.arg2+.arg1+.arg3+1 ):(.arg2+.arg1+.arg3+.arg4),1] <- 'Jul'
m[(.arg2+.arg1+.arg3+.arg4+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5),1] <- 'Aug'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6),1] <- 'Sep'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7),1] <- 'Oct'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8),1] <- 'Nov'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9),1] <- 'Dec'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8 +.arg9+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9+.arg10),1] <- 'Jan'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8 +.arg9 +.arg10+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9+.arg10+.arg11),1] <- 'Feb'
m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8 +.arg9 +.arg10+.arg11+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9+.arg10+.arg11+.arg12),1] <- 'Mar'
r rscript
2个回答
0
投票

在行m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9),1] <- 'Dec'之前,一切都可以正常工作。之后,您开始覆盖最后一个值,因为from:to范围保持不变,因为几个月'Jan'-'Mar'的频率为0。

下一个代码将克服这个问题(并且更加简单):

month_name_count <- c(4, 32, 41, 35, 26, 19, 16, 18, 12, 0, 0, 0)
month_names <- c('Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar') 
m <- data.frame('Month' = rep(month_names, month_name_count))

0
投票

您的问题是由执行a:b引起的,当a等于b+1时,您会得到一个序列c(a,a-1)而不是所需的空向量(请参见?':'?seq中的帮助)。解决此问题的最简单方法是将其重写为`seq(from = a + 1,length.out =(b-a)),这样您的最后一行将是:

m[seq(from=.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8 +.arg9 +.arg10+.arg11+1 ), length.out=.arg12),1] <- 'Mar'

话虽如此,(在我看来,一种更加惯用的方式编写代码的方式是:

.arg <- c(4,32,41,35,26,19,16,18,12,0,0,0)
m <- data.frame(Month = rep(month.abb[c(4:12,1:3)], .arg))

利用R被矢量化并使用内置的月份缩写。

© www.soinside.com 2019 - 2024. All rights reserved.