2

我无法弄清楚如何做到这一点。我在 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()?但我就是不能让他们工作。

有任何想法吗?

4

6 回答 6

10

简单一点:

> t(sapply(test, range))
  [,1] [,2]
a    1    3
b    2    5
d    1    2
于 2013-09-19T21:26:14.057 回答
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))

编辑:添加到@Blue Magister 请求以获取可重现的示例:查看?dput ?structure如何在data.frame此处发布您的内容,例如:dput(scores)。

于 2013-09-19T21:17:41.110 回答
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
于 2013-09-19T21:34:30.723 回答
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
于 2013-09-19T21:26:56.137 回答
0
colrange<-function(x){
    sapply(x,range)
}

制作一个colrange功能并插入您的数据:colrange(scores)

于 2020-07-08T04:57:56.357 回答
0

(r_dd <- range(rdu_flights[5])),这里rdu_flights是我的数据框,[5]是索引号(可以通过names("rdu_flights")找到,r_dd是我调用范围的变量。我认为这很简单。我得到的结果为 [1] -17 293 # 表示某些航班的出发延误的最小值和最大值

于 2020-04-17T08:37:05.820 回答