2013-07-22 3 views
2

Итак, я пытаюсь выяснить большую проблему, и я думаю, что это может произойти именно от того, что происходит, когда я импортирую данные из файла .txt. Мои постоянные начинающие команды:Как мои данные хранятся в R?

data<-read.table("mydata.txt",header=T) 
attach(data) 

Так что, если мои данные есть сказать, 3 колонки с заголовками "Var1", "Var2" и "Var3", как именно все импортируется? Кажется, что он импортируется как 3 отдельных вектора, а затем связан вместе, подобно использованию cbind().

Моя большая проблема заключается в изменении данных. Если строка в моем кадре данных имеет пустое место (в любом столбце) Мне нужно, чтобы удалить его:

data <- data[complete.cases(data),] 

Perfect - теперь говорит, что исходный кадр данных было 100 строк, 5 из которых были пустой слот. Мой новый кадр данных должен иметь 95 строк, не так ли? Ну, если я стараюсь:

> length(Var1) 
[1] 100 
> length(data$Var1) 
[1] 95 

Так что, похоже, как в оригинальной колонке, обозначенной Var1 не зависит от линии, где я переписал весь кадр данных. Вот почему я считаю, что когда я импортирую данные, у меня действительно есть только 3 отдельных столбца, которые хранятся где-то под названием Var1, Var2 и Var3. Насколько получать R признать, что я хочу модифицированную версию колонки, я думаю, что мне нужно сделать что-то вдоль линий:

Var1 <- data$Var1 #Repeat for every variable 

Моя проблема с этим состоит в том, что мне нужно будет написать выше бит кода для каждой отдельной переменной. Кадр данных у меня большой, и этот способ кодирования кажется утомительным. Есть ли лучший способ для меня преобразовать мои данные, а затем иметь возможность вызывать измененные переменные без необходимости использовать предикат данных $ каждый раз?

ответ

7

read.table() считывает данные в кадр данных с компонентом (столбцом) для каждого столбца (переменной) в текстовом файле. Кадр данных R похож на таблицу Excel, каждый столбец на листе может содержать другой тип данных (контраст с матрицей, которая в R может содержать данные только одного типа).

Фактически, результат выглядит так, как если бы данные были прочитаны в столбце по столбцу, а затем связаны вместе по столбцу с использованием метода cbind.data.frame(). Однако это не так, как это делается на практике.У вас есть один объект data с тремя компонентами, ни один из которых не доступен, набрав их имя (например, Var1). Попробуйте именно это

data <- read.table("mydata.txt", header = TRUE) 
Var1 

в чистой сессии (лучше всего, если вы начинаете новую сессию, чтобы попробовать это, на всякий случай).

Если бы вы набрали ls(), вы бы указали только data (при условии чистой сессии). Это явное доказательство против ваше мышление о том, что у вас есть три столбца и отдельные объекты.

Настоящая проблема здесь attach() не read.table().

Существует очень мало пользы attach(), и тот, который вы показываете, не входит в их число. attach(data) мест копияdata на пути поиска. Ключевым моментом является копия. То, что находится на пути поиска, - это не то же самое, что data в глобальной среде (вашей рабочей области). Любые изменения в data в глобальной среде не отражаются в копии на пути поиска, так как это два, полностью отдельных объекта.

R имеет путь поиска, где он ищет именованные объекты. Обычно R не просматривает объекты и, следовательно, Var1 и т. Д. Не будет отображаться всякий раз, когда вы вводите их имя в приглашении или пытаетесь напрямую использовать объект. Когда вы attach() объект, вы можете думать об этом как открытие объекта до поиска R. Но то, что улавливает людей, - это то, что теперь вы просматриваете копию объекта, а не самого объекта.

В интерактивных сеансах есть полезные вспомогательные функции, которые означают, что вам не нужно набирать data$ все время. См. ?with, ?within, ?transform например.

Действительно не используйте attach() вместо небольшого набора текста.

+1

+1, это хороший способ объяснить это. Я фактически просто помещаю что-то подобное в комментарий, используя аналогию с hardcopy vs '.doc'. – gung

3

Я уверен, что R читает файлы строка от строка. (На самом деле, я думаю, что все языки программирования работают таким образом.) Интересно, если вы прикрепляете свой фрейм данных до, удаляя неполные случаи. Поведение, которое вы описываете, довольно типично, когда люди звонят attach(data) заранее. В целом, рекомендуется не использовать attach() вообще в R. Но если вы должны использовать его, вызовите detach(data)первым, а затем изменить фрейм данных, а затем (если необходимо) называют attach(data) снова. В этот момент у вас больше не будет этой проблемы.

Обратите внимание, что также возможно, что ваша проблема - это нечто иное. Однако мы не можем сказать, основываясь на информации, представленной до сих пор. Вы хотите предоставить воспроизводимый пример, чтобы люди могли помочь вам более эффективно, см. Здесь: how-to-make-a-great-r-reproducible-example.

+0

«Не используйте' attach() '), а просто суммирует его. –

+0

Хорошо, я попробовал удалить мою строку attach(), но проблема не устранена. Я прочитал хорошую статью о том, что не использовал attach() и вместо этого использовал data = my.data в качестве аргумента, чтобы избежать использования my.data $ Var1. Когда я изучил R в своем курсе biostats, они всегда использовали attach(), поэтому теперь я знаю лучше! И о создании воспроизводимого кода - я старался изо всех сил, но я не могу понять, как создать кадр данных в r с нуля. Я объясню в 2-м комментарии. –

+0

Я попытался: 'X <-c (1,2,3) у <-c (4,5,6) данные <-data.frame (х, у)' можно назвать й или данные $ х. Если я 'remove (x)', я могу только тогда вызвать 'data $ x' (вызов' x' возвращает ошибку: объект не найден). Если я импортирую некоторые данные (например, мой исходный пост), я всегда могу просто вызвать «Var1» (нет необходимости указывать «данные $ Var1»). Я думаю, что это признак того, что я не понимаю, что происходит, когда импортируется .txt. –

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