Фрейм данных возвращается в "список" в R - PullRequest
1 голос
/ 16 июня 2020

Пожалуйста, простите меня за то, насколько c этот вопрос должен быть базовым, но я не могу, хоть убей, преобразовать свой набор данных во фрейм данных. Я новичок в R, но работал с другими языками (VBA и Matlab).

Мои данные загружаются в R ds <- read_excel("Sample Data.xlsx") в виде списка, проверенного с помощью typeof(ds). Я попытался преобразовать список во фрейм данных, используя df <- as.data.frame(ds), но это тоже не сработало. Образец набора данных прост (4 переменных по 5 наблюдений в каждой) и хранится в электронной таблице Excel. Я работаю в RStudio, и единственный загруженный мной пакет - это readxl.

Я спросил коллег и довольно много искал, но, возможно, мой вопрос сформулирован неправильно.

Edit В ответ на комментарии я проверил class как df, так и ds. class(df) возвращает data.frame, а class(ds) возвращает "tbl_df "tbl" "data.frame.

Однако даже df по-прежнему ведет себя как список. typeof(df[1]) возвращает «список», а typeof(df[[1]]) возвращает «double», как и должно быть. Функции, которые мне нужно использовать, из-за этого не работают.

cor.test(df[1], df[2]) # returns Error in cor.test.default(df[1], df[2]) : 'x' must be a numeric vector

Однако приведенный ниже код дает мне то, что мне нужно.

cor.test(df[[1]], df[[2]]) # returns an r = .29, among other stats

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Проблема, указанная в вопросе, связана с различиями в поведении в формах [ и [[ оператора извлечения.

Форма [ оператора извлечения при использовании в кадре данных возвращает другой кадр данных, который также является списком.

str(mtcars[1])
'data.frame':   32 obs. of  1 variable:
 $ mpg: num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...

Форма [[ оператора извлечения возвращает вектор.

str(mtcars[[1]])
 num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...

Поскольку base::cor.test() принимает векторы в качестве входных данных, необходимо использовать форму [[ оператора извлечения, data frame[,col] версию оператора [ или форму $. Например:

cor.test(mtcars[,1],mtcars[,4])
cor.test(mtcars[[1]],mtcars[[4]])
cor.test(mtcars$mpg,mtcars$hp)

... все они возвращают одинаковый результат:

> cor.test(mtcars$mpg,mtcars$hp)

    Pearson's product-moment correlation

data:  mtcars$mpg and mtcars$hp
t = -6.7424, df = 30, p-value = 1.788e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.8852686 -0.5860994
sample estimates:
       cor 
-0.7761684

ПРИМЕЧАНИЕ: некоторые функции R могут вместо этого обрабатывать ввод кадров данных векторов, например psych::corr.test().

> psych::corr.test(mtcars[1],mtcars[4])
Call:psych::corr.test(x = mtcars[1], y = mtcars[4])
Correlation matrix 
       hp
mpg -0.78
Sample Size 
[1] 32
Probability values  adjusted for multiple tests. 
    hp
mpg  0

 To see confidence intervals of the correlations, print with the short=FALSE option
2 голосов
/ 16 июня 2020

Думаю, вы правильно получили фрейм данных. Функция read_excel() из пакета readxl должна возвращать тиббл, который представляет собой специальный тип фрейма данных. (И если вы не укажете имя листа, он берет только первый лист и также возвращает тиббл.)

Тиббл имеет тип список , аналогично фреймам данных. Проверьте это на встроенном фрейме данных mtcars:

typeof(mtcars)

Чтобы получить класс вашего объекта, введите class(ds), и вы увидите, что это фрейм данных и тиббл. Так что вы сможете работать с ним, как с фреймом данных, не волнуйтесь.

Чтобы сослаться на его строки или столбцы, просто введите df[rows, columns], поэтому для вашего случая:

cor.test(df[ ,1], df[ ,2])
...