基于变量总和的R数据帧

时间:2020-04-08 07:40:40

标签: r rscript

我创建了以下变量。每个代表一个月。例如。 .arg1表示四月,.arg2表示五月。

.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。我创建了“月份”列。

我在那儿有“分类月份”的名字。例如。 .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'

2 个答案:

答案 0 :(得分:2)

您的问题是由执行a:b引起的,当a等于b+1时,您会得到一个序列c(a,a-1)而不是所需的空向量(请参见{ {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'

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

答案 1 :(得分:1)

在第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))