2013-09-19 3 views
1

Я не могу понять, как это сделать. У меня есть data.frame в R. Это выглядит следующим образом:R data.frame; получить диапазон значений в столбце

Scores <- read.table(text = " 
     ID Test1 Test2 Test3 Final 
1 Student1 20 23 21 48 
2 Student2 16 15 18 36 
3 Student3 25 20 22 40 
4 Student4 14 19 18 42 
5 Student5 10 15 14 30 
") 

То, что я хочу, чтобы создать новый объект данных, который имеет диапазон значений для каждого теста, включая финал. Так это будет выглядеть примерно так:

result <- read.table(text = " 
     min max 
Test1 10 25 
Test2 15 23 
Test3 14 22 
Final 30 48 
") 

Он честно не имеет значения для меня это просто перечисляет ли минимальные и максимальные значения, или на самом деле вычислить разницу. Я просто не могу понять, как реализовать это, что не является излишне сложным. Я знаю, что могу вытащить колонки вручную и индивидуально, но должен быть лучший способ сделать это. Что-то связано с by() или tapply()? Но я просто не могу заставить их работать.

Любые идеи?

+0

Похоже, это Ваш первый [г] вопрос о StackOverflow. Добро пожаловать! См. Здесь [создание воспроизводимого примера] (http://stackoverflow.com/a/5963610) в качестве руководства, чтобы помочь нам ответить на ваши вопросы в этой и будущих сообщениях. –

+0

О, ладно! Я буду использовать это для дальнейшего использования. Спасибо –

ответ

1

Попробуйте этот воспроизводимый пример.

test <- data.frame(a=c(1,2,3),b=c(2,3,5),d=c(1,2,2)) 
data.frame(min=sapply(test,min),max=sapply(test,max)) 

EDIT: Добавление запроса @Blue магистра для воспроизводимых например: Посмотрите на ?dput?structure, чтобы выяснить, как разместить свои data.frame здесь, например: dput (баллов).

+0

Хорошо, спасибо за помощь! Скручивание вокруг кажется, что все, что мне нужно сделать, это использовать индексирование (т. Е. Test [, i]), чтобы получить конкретные столбцы или диапазоны из них. Большое спасибо! –

10

Немного проще:

> t(sapply(test, range)) 
    [,1] [,2] 
a 1 3 
b 2 5 
d 1 2 
+3

Нужно найти диапазон, используйте 'range()' - кажется самым разумным вариантом для меня. – thelatemail

+0

Есть ли способ сделать это, не получая повторяющихся значений в диапазоне? –

+0

@ MichaelPerdue вы имеете в виду, если мин и макс диапазона одинакового числа? –

0
set.seed(1) 
scores <- data.frame(ID=paste0("Student",1:5), 
        T1=sample(100,5), 
        T2=sample(100,5), 
        T3=sample(100,5), 
        Final=sample(100,5)) 

summ <- data.frame(min=apply(scores[,!grepl("ID",colnames(scores))],2,min), 
        max=apply(scores[,!grepl("ID",colnames(scores))],2,max)) 

> summ 
     min max 
T1  20 89 
T2  6 94 
T3  18 74 
Final 37 98 
0

Другой подход:

kk<-Map(function(x) cbind(x,min=min(Scores[,x]),max=max(Scores[,x])), as.list(names(Scores)[-1])) 
data.frame(do.call(rbind,kk)) 
     x min max 
1 Test1 10 25 
2 Test2 15 23 
3 Test3 14 22 
4 Final 30 48 
Смежные вопросы