Сравнить два вектора разной длины в R
я боролся с этой проблемой и решил обратиться за помощью после некоторых неудач..
вот моя проблема, я хочу разделить эти два вектора на основе дня, например 2012-12-11 будет 3/17 и 2012-12-12 должно быть 0/7. Однако я не могу понять, как это сделать..
> ili
2012-12-11 2012-12-13 2012-12-14 2012-12-17
3 6 7 1
> no.ili
2012-12-11 2012-12-12 2012-12-13 2012-12-14 2012-12-15 2012-12-16 2012-12-17
17 7 232 322 38 21 36
последней попыткой было зациклить два вектора и добавить значение или ноль к новому вектору, однако, когда я использую %in%
он не помещает значения в порядок (очевидно), но если я использую ==
Он также не работает..
days.ili <- unique(one.three$timestamp)
days <- unique(one.week$timestamp)
ili.vec <- rep(0, length(days))
for (i in 1:length(days)) {
if (days.ili[i] %in% days) {
ili.vec[i] <- ili[i]
} else {
ili.vec[i] <- 0
}
}
Я, должно быть, забыл кое-что, так как я не могу видеть через эту проблему.. Может ли кто-нибудь дать мне представление о лучшем способе достижения этого в R?
возможно, опция будет использовать merge
..
3 ответов
что-то вроде этого:
res <- rep(0, length(no.ili))
where <- match( names(ili), names(no.ili) )
res[ where ] <- ili / no.ili[where]
names(res) <- names(no.ili)
res
# 2012-12-11 2012-12-12 2012-12-13 2012-12-14 2012-12-15 2012-12-16 2012-12-17
# 0.17647059 0.00000000 0.02586207 0.02173913 0.00000000 0.00000000 0.02777778
решение Ромена намного чище, но предполагает no.ili
всегда будет больше..
ili <-
c( 3 , 6 , 7 , 1 )
names( ili ) <-
as.Date( c( '2012-12-11' , '2012-12-13' , '2012-12-14' , '2012-12-17' ) )
no.ili <-
c( 17 , 7 , 232 , 322 , 38 , 21 , 36 )
names( no.ili ) <-
as.Date( c( '2012-12-11' , '2012-12-12' , '2012-12-13' , '2012-12-14' , '2012-12-15' , '2012-12-16' , '2012-12-17' ) )
ili.df <- data.frame( ili )
ili.df$Date <- rownames( ili.df )
no.ili.df <- data.frame( no.ili )
no.ili.df$Date <- rownames( no.ili.df )
x <- merge( ili.df , no.ili.df , all = TRUE )
x[ is.na( x ) ] <- 0
result <- x$ili / x$no.ili
names( result ) <- x$Date
result
да, слияние-это одно из возможных решений. Фокус в том, чтобы переформулировать ili/no.фреймы данных ili с именами столбцов в качестве дополнительной переменной, он же длинный формат. Затем используйте merge с аргументом all, установленным в TRUE:
ili2 <- data.frame(date=colnames(ili),
ili=as.numeric(ili[1,]),
stringsAsFactors=FALSE)
no.ili2 <- data.frame(date=colnames(no.ili),
no.ili=as.numeric(no.ili[1,]),
stringsAsFactors=FALSE)
tmp <- merge(ili2, no.ili2, all=TRUE)
затем, чтобы выполнить разделение, которое вы просили (и которое я изначально перечитал), сначала установите отсутствующие значения в 0, а затем разделите:
tmp[is.na(tmp[,"ili"]),"ili"] <- 0
tmp[is.na(tmp[,"no.ili"]),"no.ili"] <- 0
res <- tmp[,"ili"]/tmp[,"no.ili"]