Вывод кадра данных не соответствует ожидаемому в R - PullRequest
0 голосов
/ 28 апреля 2018

Ниже программа, которую я написал,

func <- function(id = 1:200)
{
dir_char <- as.character(directory) ### changing directory input to character
set_dir <- paste('C:/Users/Junk/Documents/',dir_char,sep="") ### setting working directory path
setwd(set_dir)  ### setting input directory as working directory
count <- 0
for (i in id)   ### going through the id values
{
    id_char <- as.character(i)   ### changing id value to character for setting the file name
    new_file <- data.frame(read.csv(paste(id_char,".csv",sep="")))
    mod_file <- data.frame(new_file[complete.cases(new_file),])
    count <- nrow(mod_file) 
    print(count)
    out_file <- data.frame(id = id, nobs = count)
}
return(out_file)}

Вывод этой функции следующий

[1] 1041
[1] 474
[1] 192 
[1] 148
[1] 96
   id nobs
1  2   96
2  4   96
3  8   96
4 10   96
5 12   96

Почему фрейм данных out_file не хранит значения count после каждой итерации цикла, я ожидал, что фрейм данных будет хранить значения print(count) в out_file. Где я иду не так, пожалуйста, помогите мне разобраться в проблеме.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вы сделали несколько вещей неправильно. Часть объяснения сделана моим MKR в его ответе. Цикл создает проблему. Кроме того, я предполагаю, что вы хотите один nobs за один id. Если это так, попробуйте это ::

  func <- function(id = 1:200)
    {
    dir_char <- as.character(directory) ### changing directory input to character
    set_dir <- paste('C:/Users/Junk/Documents/',dir_char,sep="") ### setting working directory path
    setwd(set_dir)  ### setting input directory as working directory
    cnt<- 0
    out_file <- data.frame(id = numeric(), nobs = numeric())
    for (i in id)   ### going through the id values
    {
        id_char <- as.character(i)   ### changing id value to character for setting the file name
        new_file <- data.frame(read.csv(paste(id_char,".csv",sep="")))
        mod_file <- data.frame(new_file[complete.cases(new_file),])
        cnt<- nrow(mod_file) 
        print(cnt)
        out_file <- rbind(out_file, data.frame(id = i, nobs = cnt))
    }
    # the last line is always returned.. no need to use return
    out_file
   }
0 голосов
/ 28 апреля 2018

Проблема в линии

`out_file <- data.frame(id = id, nobs = count)`

data.frame создается в каждом цикле. И последний возвращается. Вы можете изменить логику и создать data.frame после окончания loop.

Один из способов решения проблемы может быть (я изменил соответствующий раздел функции):

func <- function(id = 1:200)
{
dir_char <- as.character(directory) ### changing directory input to character
set_dir <- paste('C:/Users/Junk/Documents/',dir_char,sep="") ### setting working directory path
setwd(set_dir)  ### setting input directory as working directory

count <- numeric(length(id))
for (i in id)   ### going through the id values
{
    ### changing id value to character for setting the file name
    id_char <- as.character(i)   
    new_file <- data.frame(read.csv(paste(id_char,".csv",sep="")))
    mod_file <- data.frame(new_file[complete.cases(new_file),])
    count[i] <- nrow(mod_file) 
    print(count)

}
 out_file <- data.frame(id = id, nobs = count)
 return(out_file)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...