R фрейм данных на основе суммы переменных - PullRequest
0 голосов
/ 08 апреля 2020

Я создал следующие переменные. Каждый обозначает месяц. Например. .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. Таким образом, мой datarow - 203. Я создал столбец Месяц.

У меня есть имя Месяца Категоризации. Например. .arg1 = 4. Это означает, что в строке 1 - строке 4 в столбце «Месяц» будет указано значение «Апр». Проблема возникает, когда у меня значение Zero между переменными .arg. При выполнении нижеприведенного скрипта по умолчанию создается Мар. Даже если оно имеет значение 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 ]

2 голосов
/ 08 апреля 2020

Ваша проблема вызвана выполнением 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'

Сказав это, более r-idiomati c способ написания вашего кода (на мой помните):

.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 и использованием встроенных сокращений месяца.

1 голос
/ 08 апреля 2020

Все отлично работает с вашим кодом до строки m[(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+1 ):(.arg2+.arg1+.arg3+.arg4+.arg5+.arg6+.arg7+.arg8+.arg9),1] <- '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))
...