【问题标题】:R data frame based on sum of variables基于变量总和的R数据框
【发布时间】:2025-12-10 14:45:01
【问题描述】:

我在下面创建了变量。每个代表一个月。例如。 .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。我创建了 Month 列。

我在那里有分类月份名称。例如。 .arg1 = 4。这意味着第 1 行到第 4 行将在 Month 列中具有名为“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


    【解决方案1】:

    您的问题是由执行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 被矢量化并使用内置的月份缩写。

    【讨论】:

    • 有效的问题是我所有的 .arg 值都是动态的。值可以是任何东西。只是想知道如何在通用公式中实现它。有什么想法吗?
    【解决方案2】:

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

    下一个代码将解决这个问题(而且更简单):

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

    【讨论】: