[R-br] Substituir NA em data.frame 1 por dados data.frame 2

Alisson Lucrecio alissonluc em yahoo.com.br
Sexta Outubro 18 15:18:43 BRT 2013


Caro Éder, muito obrigado por sua atenção o script esta ótimo. 
 
Alisson Lucrécio da Costa



On Friday, October 18, 2013 2:30 PM, Éder Comunello <comunello.eder em gmail.com> wrote:
 
Alisson, boa tarde!

Embora o script abaixo possa não ser a melhor forma de resolver o problema, deve servir como ponto de partida!

### <BEGIN> ###
### Dados
dURL1 <- 'http://r-br.2285057.n4.nabble.com/attachment/4660645/0/normais.clima.csv'
dURL2 <- 'http://r-br.2285057.n4.nabble.com/attachment/4660645/1/inmet.mensal.csv'
dNormal  <- read.table(dURL1, header=T, sep=';')
dMensal  <- read.table(dURL2, header=T, sep=';')

### Inspecionando os dados (colunas, linhas e contagem de NA's)
length(dNormal); nrow(dNormal); length(which(is.na(dNormal)))
length(dMensal); nrow(dMensal); length(which(is.na(dMensal)))
head(dNormal,3); head(dMensal,3) 

### Mapeia os valores NA's
naMap <- which(is.na(dNormal), arr.ind = TRUE, useNames = TRUE); head(naMap)

### Visualiza NA's
length(naMap[,1]); length(unique(naMap[,1])) ### Linhas que contém algum NA
dNormal[unique(naMap[,1]),]
dNormal[(naMap[,1]),] ### mesmo que anterior / talvez aplique 'unique' por 'default'?

### Correlacionar as tables usando $Codigo e $Mes e preparar data.frame
naData          <- data.frame(naMap)
naData$Codigo   <- dNormal[naMap[,1],]$Codigo
naData$Mes      <- dNormal[naMap[,1],]$Mes
naData$ver      <- (naData$Codigo %in% dMensal$Codigo) & (naData$Mes %in% dMensal$Mes)
naData$pos      <- NA
naData$val      <- NA
### (ver)ifica correspondência
### (pos)ição da correspondência
### (val)or correspondente
head(naData)

### Linhas sem correspondência
head(naData[which(naData$ver==F),])
nrow(naData[which(naData$ver==F),])

### Obter valores para dados com correspondência ($val)
for (i in 1:nrow(naData)) { 
          if (naData$ver[i]==TRUE) {  
                    naData$pos[i]=(which(dMensal$Codigo==naData[i,3] & dMensal$Mes==naData[i,4]))
                    naData$val[i]=(dMensal[naData$pos[i],naData$col[i]])
}}

### Confere número de dados sem valor (~ linhas sem correspondência)
length(which(is.na(naData$val)))

### Nesse ponto, naData compila o valor e a posição onde mudar.
head(naData)

### Operando em uma cópia dos dados originais
dNormal2 <- dNormal

for (i in 1:nrow(naData)) {
          dNormal2[naMap[i,1],naMap[i,2]] <- naData$val[i]                    
          }

### Inspeção final
length(which(is.na(dNormal)))  ### NA's no original
length(which(is.na(dNormal2))) ### NA's no final

head(dNormal2)

str(dNormal2)
#edit(dNormal2)

### <END> ###



Éder Comunello <comunello.eder em gmail.com> 
Dourados, MS - [22 16.5'S, 54 49'W]
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20131018/ed5a8340/attachment.html>


Mais detalhes sobre a lista de discussão R-br