Как разделить фрейм данных на новые фреймы данных (например, новые данные1, данные2, данные3 и т. Д.), Чтобы я мог проанализировать каждый из них (например, T-тест) - PullRequest
0 голосов
/ 20 января 2020

Я только начинаю изучать R для анализа данных. Вот моя проблема.

enter image description here

Я хочу проанализировать разницу в массе тела (BW) между самцом и самкой у разных видов. (Например, в Sorex gracillium вес мужского и женского тела значительно отличается, просто пример, я не знаю ответа. :)) Сначала я подумал, может быть, сначала смогу разделить их по видам на несколько групп. (Это действительно может быть сделано в Excel, но у меня слишком много файлов, я думаю, что, возможно, R лучше) А потом я могу просто использовать некоторый простой код для проверки различий в полу. Но я не знаю, как их разделить, как создать новый фрейм данных ... Я пытался использовать group_split. Это действительно разделили данные, но только много пустяков. как показанное изображение

enter image description here

Что мне делать? Или, может быть, есть лучший способ проверить разницу?

Я иностранец, поэтому, возможно, есть много грамматических ошибок ... Но я буду очень признателен, если вы поможете!

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Предполагая, что ваши данные находятся в файле data.frame, называемом df, со столбцами NO, SPECIES, SEX, BW:

set.seed(100)
df = data.frame(NO=1:100,
SPECIES=sample(LETTERS[1:4],100,replace=TRUE),
SEX=sample(c("M","F"),100,replace=TRUE),
BW = rnorm(100,80,2)
)

И мы производим вид D, чтобы иметь эффект:

df$BW[df$SPECIES=="D" & df$SEX=="M"] = df$BW[df$SPECIES=="D" & df$SEX=="M"] + 5

Если мы хотим сделать это для одного фрейма данных, скажем, для вида А, мы делаем

dat = subset(df,SPECIES=="A")
t.test(BW ~ SEX,data=dat)

И вы получите соответствующую статистику и так далее. Чтобы сделать это систематически для всех ВИДОВ, мы можем использовать broom, dplyr:

library(dplyr)
library(broom)

df %>% group_by(SPECIES) %>% do(tidy(t.test(BW ~ SEX,data=.)))

# A tibble: 4 x 11
# Groups:   SPECIES [4]
  SPECIES estimate estimate1 estimate2 statistic p.value parameter conf.low
  <fct>      <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
1 A          0.883      80.4      79.6     0.936 3.65e-1      14.2   -1.14 
2 B          0.259      80.2      79.9     0.377 7.12e-1      14.1   -1.21 
3 C          0.170      80.1      79.9     0.359 7.23e-1      25.3   -0.807
4 D         -5.55       79.7      85.2    -7.71  1.29e-7      21.4   -7.05 

Если вы не хотите устанавливать какие-либо пакеты, это даст вам все результаты теста:

by(df, df$SPECIES, function(x)t.test(BW ~ SEX,data=x))

И объединяя их в один data.frame:

func = function(x){ 
Nu=t.test(BW ~ SEX,data=x);
data.frame(estimate_1=Nu$estimate[1],estimate_2=Nu$estimate[2],p=Nu$p.value)} 
do.call(rbind,by(df, df$SPECIES,func)) 
0 голосов
/ 20 января 2020

Вот пример установки нескольких фреймов данных из одного. Примерный набор данных iris представляет собой таблицу символов для 3 видов.

Сначала вы можете установить вектор со всеми видами в вашем фрейме данных nspe. Затем я создаю список той же длины.

Параметр для l oop позволяет просматривать каждый элемент этого списка и помещать его в data.frame только с видами.

На В конце этого сценария я вычисляю среднюю ширину лепестков видов сетоз. Если бы у меня было два отдельных персонажа на этот вид, я мог бы также сделать тест. Я сделал один здесь, но это не очень полезно ...

data("iris")
summary(iris)

nspe <- as.vector(unique(iris$Species))

spe <- list() ; length(spe) = length(nspe) ; names(spe) <- nspe

for(i in nspe){
  spe[i][[1]] <- iris[which(iris$Species == i),]
}

mean(spe$setosa$Petal.Width)
# [1] 0.246
t.test(spe$setosa$Petal.Width)

Ниже приведен пример, чтобы показать, как вы можете провести t.test для одного вида. Обратите внимание, что у вас наверняка будут проблемы с названиями видов и пробелами, поэтому я думаю, что проще установить ID для видов, чем сохранять их полные названия.

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

# NOT RUN
t.test(
  spe$Sorex_gracilliums$BW[which(spe$Sorex_gracilliums$SEX == 'm')],
  spe$Sorex_gracilliums$BW[which(spe$Sorex_gracilliums$SEX == 'f')]
)
...