Solucionado (ver solução)
Solucionado
(ver solução)
18
respostas

i com duas dimensoes

Aconteceu isso com alguém?

Ponho o código e no final me sai que i debe ter somente uma dimensao, nao duas.

O resultado na base de datos é que a partir do primeiro na na columna Rating, todos los resultados na columna NewRating sao na.

for (i in 1:nrow(datos2)) {

  • if(is.na(datos2[i,"Rating"])){
  • datos2[i,"NewRating"] <- mean_category[mean_category$Category == datos2[i, "Category"], "media"]
  • }else {
  • datos2[i,"NewRating"] <- datos2[i, "Rating"]
  • }
  • } Error: i must have one dimension, not 2.

Obrigado!

18 respostas

Bom dia Yan, tudo bem?

Coloca um print após o for para verificarmos qual está sendo a saída do i.

for (i in 1:nrow(datos2)) {
    print(i)
}

Oi Gabriel,

Segue a saida :

for(i in 1:nrow(datos2)){
  print(i)
}

[1] 9841 [1] 9842 [1] 9843 [1] 9844 [1] 9845 [1] 9846 [1] 9847 [1] 9848....

A saida en Values é i = 10840L

Quando executo o codigo todo:

for(i in 1:nrow(datos2)){
  if(is.na(datos2[i ,"Rating"])){
    datos2[i,"NewRating"] <- mean_category[mean_category$Category == datos2[i,"Category"],"media"]
  }else{
      datos2[i,"NewRating"] <- datos2[i, "Rating"]
  }
}

A saida é

> for(i in 1:nrow(datos2)){
+   if(is.na(datos2[i ,"Rating"])){
+     datos2[i,"NewRating"] <- mean_category[mean_category$Category == datos2[i,"Category"],"media"]
+   }else{
+       datos2[i,"NewRating"] <- datos2[i, "Rating"]
+   }
+ }
Error: `i` must have one dimension, not 2.
> 

e em values: i = 24L

Obrigado

Yan, vamos fazer uma depuração na mão pra ver exatamente o que está acontecendo, porque o 24L é um tipo de dados numérico no R, então, não deveria está dando esse erro. Se você executar vai funcionar normalmente.

datos2[24L,"Rating"] 

Me fala qual é a versão do seu R, por favor?

E executa o código abaixo:

for(i in 1:nrow(dados_2)){
    print(i)
    if(is.na(dados_2[i,"Rating"])){
      cat('IF: ', dados_2[i,"newRating"],mean.Category[mean.Category$Category == dados_2[i,"Category"],]$mean)
    }else{
      cat('ELSE: ', dados_2[i,"Rating"])
    }
    cat('\n==\n')
  }

Vamos ver quais serão os resultados.

Minha versao do R é 3.6.3 (2020-02-29)

Só mudei os nomes das BD.

 for(i in 1:nrow(datos2)){
+   print(i)
+   if(is.na(datos2[i,"Rating"])){
+     cat('IF: ', datos2[i,"newRating"],mean_Category[mean_Category$Category == datos2[i,"Category"],]$mean)
+   }else{
+     cat('ELSE: ', datos2[i,"Rating"])
+   }
+   cat('\n==\n')
+ }
[1] 1
ELSE:  Error in cat("ELSE: ", datos2[i, "Rating"]) : 
  el argumento 2 (type 'list') no es soportado por 'cat'
> 

Ah sim. Essa versão é muito recente do R, então, alguns pacotes ou procedimentos podem deixar de funcionar, como parece ser é o seu caso.

Eu recomendo você fazer um downgrade para a versão 3.6.1 que é versão mais estável até o momento. (isso é comum acontece em tecnologias open source não se preocupe.)

Qual é o seu S.O?

Ah, pode ser isso mesmo. Obrigado. Vou fazer o downgrade e tentar realizar os procedimentos.

Meu sistema é o Ubuntu 18.04 LTS

Obrigado!

Beleza.

Qualquer problema só me falar.

Oi Gabriel,

Tentei instalar uma versao anterior, mas nao sabia que ia ser tao complicado porque inclusive no site oficial do R aparece a ultima versao de 3.6 , que é a 3.6.3, e 4.0

Se tiver alguma dica de como fazer isso.

Linux é um pouco complicado mesmo. hehehe

Vamos lá:

1 - Desinstalar o R da máquina:

sudo apt-get remove r-base-core
sudo apt-get remove r-base 

2 - Opção 1:

sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu disco-cran35/'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
sudo apt update
sudo apt install r-base

se não funcionar:

sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu xenial-cran35/'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
sudo apt update
sudo apt install r-base

se não funcionar: fazer download da versão: https://cran.r-project.org/src/base/R-3/

  • Depois de extrair os arquivos em uma pastar, executar os comandos:
    ./configure
    make
    make install

Gabriel, te agradeço de verdade sua atençao. Eu tentei a primeira forma e me instala a versao 3.6.3, a segunda forma me aparece logo na ultima linha do resultado do comando "./configure" um erro:

configure: error: --with-x=yes (default) and X11 headers/libs are not available

E depois quando tento executar o "make" me aparece, (estou na espanha, por isso sai o resultado em espanhol:

Documentos/R-3.6.1 (1)/R-3.6.1$ make
make: *** No se especificó ningún objetivo y no se encontró ningún makefile.  Alto.

E "make install"

~/Documentos/R-3.6.1 (1)/R-3.6.1$ make install
make: *** No hay ninguna regla para construir el objetivo 'install'.  Alto.

Acho que me resta ficar con a versao 3.6.3 mesmo e ir me adaptando a ela. Mas de verdade, muito obrigado,

Vamos tentar corrigir esse erro do ./config, porque já teve outros alunos com outros problemas nessa versão 3.6.3 hehehe.

Tenta executar esse comando:

sudo apt-get install libx11-dev
sudo apt-get install xorg-dev

Oi Gabriel,

Eu tentei isso que você me indicou, acho que o erro do ./configure foi solucionado, mas make e make install deram problema, ponho a saida deles resumida:

Ultimas linhas do /.configure:

configure: WARNING: you cannot build info or HTML versions of the R manuals
configure: WARNING: neither inconsolata.sty nor zi4.sty found: PDF vignettes and package manuals will not be rendered optimally

Saida make resumida:

make[1]: se entra en el directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/m4'
make[1]: No se hace nada para 'R'.
make[1]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/m4'
make[1]: se entra en el directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/tools'
make[1]: No se hace nada para 'R'.
make[1]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/tools'
make[1]: se entra en el directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/doc'
make[2]: se entra en el directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/doc/html'
make[2]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/doc/html'
make[2]: se entra en el directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/doc/manual'
make[2]: No se hace nada para 'R'.
make[2]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/doc/manual'
[...]

collect2: error: ld returned 1 exit status
Makefile:145: recipe for target 'R.bin' failed
make[3]: *** [R.bin] Error 1
make[3]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/src/main'
Makefile:137: recipe for target 'R' failed
make[2]: *** [R] Error 2
make[2]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/src/main'
Makefile:28: recipe for target 'R' failed
make[1]: *** [R] Error 1
make[1]: se sale del directorio '/home/Documentos/R-3.6.1 (1)/R-3.6.1/src'
Makefile:60: recipe for target 'R' failed
make: *** [R] Error 1

Saida make install

mkdir -p -- /usr/local/lib/R
mkdir: no se puede crear el directorio «/usr/local/lib/R»: Permiso denegado
Makefile:139: recipe for target 'installdirs' failed
make: *** [installdirs] Error 1

Ola Yan, esses erros estão me parecendo de permissão.

Você tentou executar como sudo? Se não, faz esse teste.

Se der erro, tenta executar o código:

./configure --prefix=/usr/local --enable-R-shlib --with-tcltk

make

sudo apt-get install checkinstall

sudo checkinstall

Ola gabriel, tentei o que você falou e a instalaçao falhou. Mas me parece que avançou mais do que das outras vezes. Eu executo con sudo na primeira, que é quando generalmente me solicita a senha. Ponho aqui as saidas, ok?

Saida ./configure --prefix=/usr/local --enable-R-shlib --with-tcltk ultimas linhas:

R is now configured for x86_64-pc-linux-gnu

  Source directory:            .
  Installation directory:      /usr/local

  C compiler:                  gcc  -g -O2
  Fortran fixed-form compiler: gfortran -fno-optimize-sibling-calls -g -O2

  Default C++ compiler:        g++ -std=gnu++11  -g -O2
  C++98 compiler:              g++ -std=gnu++98  -g -O2
  C++11 compiler:              g++ -std=gnu++11  -g -O2
  C++14 compiler:              g++ -std=gnu++14  -g -O2
  C++17 compiler:              g++ -std=gnu++17  -g -O2
  Fortran free-form compiler:  gfortran -fno-optimize-sibling-calls -g -O2
  Obj-C compiler:            

  Interfaces supported:        X11
  External libraries:          readline, curl
  Additional capabilities:     PNG, JPEG, NLS, ICU
  Options enabled:             shared R library, shared BLAS, R profiling

  Capabilities skipped:        TIFF, cairo
  Options not enabled:         memory profiling

  Recommended packages:        yes

configure: WARNING: you cannot build info or HTML versions of the R manuals
configure: WARNING: neither inconsolata.sty nor zi4.sty found: PDF vignettes and package manuals will not be rendered optimally

Saida make ultimas linhas:

Makefile:135: recipe for target 'R' failed
make[2]: *** [R] Error 2
make[2]: se sale del directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/src/main'
Makefile:28: recipe for target 'R' failed
make[1]: *** [R] Error 1
make[1]: se sale del directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/src'
Makefile:60: recipe for target 'R' failed
make: *** [R] Error 1

Saida sudo checkinstall:

checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
           Este software es distribuído de acuerdo a la GNU GPL



*****************************************
**** Debian package creation selected ***
*****************************************

*** Warning: The package name "R" contains upper case
*** Warning: letters. dpkg might not like that so I changed
*** Warning: them to lower case.

Este paquete será creado de acuerdo a estos valores:

0 -  Maintainer: [ root@vant-N2x0WU ]
1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ r ]
3 -  Version: [ 3.6.1 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ R-3.6.1 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ r ]
12 - Conflicts: [  ]
13 - Replaces: [  ]

Introduce un número para cambiar algún dato u oprime ENTER para continuar:

Installing with make install...

====================== Resultados de la instalación  =====================
/usr/bin/installwatch: eval: línea 133: error sintáctico cerca del elemento inesperado `('
/usr/bin/installwatch: eval: línea 133: `echo /home/vant/Documentos/R-3.6.1 (1)/R-3.6.1,/dev,/proc,/tmp,/var/tmp'
make[1]: se entra en el directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/m4'
make[1]: No se hace nada para 'install'.
make[1]: se sale del directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/m4'
make[1]: se entra en el directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/tools'
make[1]: No se hace nada para 'install'.
make[1]: se sale del directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/tools'
make[1]: se entra en el directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/doc'
installing doc ...
/usr/bin/install: no se puede efectuar `stat' sobre 'NEWS.rds': No existe el archivo o el directorio
help2man: can't get `--version' info from ../bin/R
Makefile:45: recipe for target 'R.1' failed
make[1]: *** [R.1] Error 127
make[1]: se sale del directorio '/home/vant/Documentos/R-3.6.1 (1)/R-3.6.1/doc'
Makefile:96: recipe for target 'install' failed
make: *** [install] Error 1

**** La instalación falló. Abortando la creación del paquete.

Restaurando los archivos sobreescritos...OK

Limpiando.../usr/bin/checkinstall: línea 328: [: /home/vant/Documentos/R-3.6.1: se esperaba un operador binario
OK

Adiós.

Rapaz, que loucura. Mas vamos continuar a luta hehehe

Tenta esse código

sudo add-apt-repository ppa:marutter/rdev
sudo apt-get update
solução!

Yan, criei um ambiente aqui com Linux e R versão 3.6.3 e com a versão 0.8.5 do pacote dplyr. Executei esse procedimento e não deu nenhum problema. Será que você não alterou alguma coisa no código? Executa apenas o código abaixo para testarmos.

dados <- read.csv("googleplaystore.csv",stringsAsFactors = FALSE)

dados_2 <- dados %>% 
    filter(Category != "1.9")

dados_2 %>% filter(is.na(Rating)) %>% count()

dados_2 %>%
    filter(is.na(Rating) ) %>%
    group_by(Category) %>%
    count()

mean.Category <- dados_2 %>%
    filter(!is.na(Rating)) %>%
    group_by(Category) %>%
    summarise(mean = mean(Rating))


for(i in 1:nrow(dados_2)){
    if(is.na(dados_2[i,"Rating"])){
      dados_2[i,"newRating"] <- mean.Category[mean.Category$Category == dados_2[i,"Category"],]$mean
    }else{
      dados_2[i,"newRating"] <- dados_2[i,"Rating"]
    }
  }

Obrigado, Gabriel. Tanto pela paciencia quanto por compartir o conhecimento.

Executei o codigo e deu certo!

Muito obrigado!

\o/ \o/

É assim mesmo, são nesses momentos que aprendemos, inclusive eu hehehehe.

Qualquer coisa só falar.

Bons estudos, abraços!!!