2016-12-01 3 views
-2

Для назначения я написал функцию с «id» в качестве аргумента, в которой я создаю нулевой кадр данных, а затем в цикле for считывает количество полных случаев (без NA) в серии файлов CSV. Это дает мне фрейм данных «dat» с двумя столбцами (id, # complete cases), которые я проверил. Теперь у меня возникли проблемы с подмножеством, основанным на аргументе id. Я должен быть в состоянии подмножества на колонке 1, которое эквивалентно ID:R подмножество данных по столбцу

dat[which(dat[, 1] %in% id),] 

но при запуске этой функции, ничего не возвращается (нет выхода, нет ошибки). После некоторого поиска на этом сайте и других, я попытался назвать столбцы, когда я создал фрейм данных, чтобы иметь что-то называть столбец в Подменю:

dat <- data.frame("monitor"=integer(), "nobs"=integer()) 
dat_subset <- dat[which(dat[, "monitor"] %in% id),] 

но это возвращает «неопределенные столбцы, выбранные». Так что я попытался указать мой кадр данных другой способ:

dat <- data.frame(ncol=2) 
colnames(dat) <- c("ID", "nobs") 

, но это дает атрибут «имен» Ошибка [2] должна быть такой же длины, как и вектор [1]. Что такое вектор длины 1? Разве я не запрашивал 2-х столбцовый фрейм данных?

Может ли кто-нибудь помочь мне отладить любые из этих параметров? Большое спасибо!

Редактировать на основе обратной связи: Я правильно инициализирован фреймом данных (благодаря комментариям). dat < - data.frame ("ID" = integer (0), "nobs" = integer (0)) Str(dat) показывает, что я сделал это правильно 'data.frame': 0 obs. от 2-х переменных: $ ID: ИНТ $ Ноббс: Int Таким образом, кажется, что моя проблема заключается в цикл, который следует, так как с помощью str(dat) после цикла показывает имена столбцов были сняты:

for (i in 1:332) { 
     nobs <- sum(complete.cases(read.csv(files_list[i]))) 
     rowvector <- c(i,nobs) 
     dat <- rbind(dat, rowvector) 
    } 
'data.frame': 332 obs. of 2 variables: 
$ X1L : int 1 2 3 4 5 6 7 8 9 10 ... 
$ X117L: int 117 1041 243 474 402 228 442 192 275 148 ... 

Почему имена не прилипают при добавлении строк в фрейм данных? ?rbind утверждает, что «имена столбцов берутся из первого аргумента с соответствующими именами».

+0

См. '? Data.frame'. В функции нет аргумента 'ncol'. Если вы используете 'data.frame (ncol = 2)' и распечатываете его, вы увидите 'data.frame' со столбцом с именем' ncol'. – JasonWang

+0

есть много понятий для объяснения здесь. слишком широкий вопрос. Одна ошибка, которую я могу найти, - это то, что [, 1] возвращает data.frame, и вы можете использовать аргумент 'drop = TRUE', чтобы сделать его вектором –

ответ

0

Я считаю, что это то, что вы ищете, используя функцию subset.

fun <- function(want) { 
    # Here's a random example 
    # dat <- data.frame(id = rep(1:3, each = 3), 
    #     n_complete = as.integer(runif(9, max = 100))) 
    # > str(dat) 
    # 'data.frame': 9 obs. of 2 variables: 
    # $ id  : int 1 1 1 2 2 2 3 3 3 
    # $ n_complete: int 3 80 5 84 67 83 48 49 52 

    # Or using the file reading code from the question edit 
    # dat <- data.frame(id = integer(), n_complete = integer()) 
    # for (i in 1:332) { 
    # nobs <- sum(complete.cases(read.csv(files_list[i]))) 
    # dat <- rbind(dat, data.frame(id = i, n_complete = nobs)) 
    # } 

    # Better yet, preallocate dat before filling 
    dat <- data.frame(id = 1:332, n_complete = 0) 
    for (i in dat$id) { 
    nobs <- sum(complete.cases(read.csv(files_list[i]))) 
    dat$n_complete[i] <- nobs 
    } 

    # Subset by requesting specific id values 
    return(subset(dat, id %in% want)) 
} 

# Ask for ids 1 and 2 
fun(c(1, 2)) 
# > str(fun(c(1, 2))) 
# 'data.frame': 6 obs. of 2 variables: 
# $ id  : int 1 1 1 2 2 2 
# $ n_complete: int 3 80 5 84 67 83 
+0

Спасибо за комментарии. Да, полезно использовать str, чтобы увидеть, где я стою. Я правильно инициализировал свой фрейм данных с именами столбцов: dat <- data.frame («ID» = integer (0), «nobs» = integer (0)) и str (dat) показывает мне «data.frame», : \t 0 общ. из 2 переменных: $ ID: int $ nobs: int – Joanne

+0

извините за половину комментария, просто выясняя эту систему! – Joanne

+0

Возможно, я неправильно понял ваш вопрос, но я думаю, что все, что вам нужно сделать, это добавить свой код, который читается в данных, где я создал образец 'dat', и это способно подмножать его. Если у вас больше проблем, прочитайте в своих данных и вставьте выходные данные 'str (dat)' –

Смежные вопросы