我无法弄清楚如何做到这一点。我在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
")
我想要的是创建一个新的数据对象,其中包含每个测试的值范围,包括final。所以它看起来像这样:
result <- read.table(text = "
min max
Test1 10 25
Test2 15 23
Test3 14 22
Final 30 48
")
老实说,无论是仅列出最大值和最小值,还是实际计算差值,我都无所谓。我只是无法找到实现这一点的方法,这不是一种不必要的复杂。我知道我可以手动和单独拉出列,但必须有一些更好的方法来做到这一点。涉及by()
或tapply()
的内容?但我无法让他们工作。
有什么想法吗?
答案 0 :(得分:10)
更简单一点:
> t(sapply(test, range))
[,1] [,2]
a 1 3
b 2 5
d 1 2
答案 1 :(得分: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(得分)。
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分:0)
(r_dd <-range(rdu_flights [5])), 这里rdu_flights是我的数据帧,[5]是索引号(可以通过使用names(“ rdu_flights”找到),r_dd是我在调用范围的变量,我认为这很简单。 我得到的结果是 [1] -17293#表示某些航班的出发延迟的最小值和最大值
答案 5 :(得分:0)
colrange<-function(x){
sapply(x,range)
}
进行colrange
功能并插入数据:colrange(scores)