如果我有一个包含600列(变量)和10行的data.frame(sum_clus),这些行没有NA,并且都是数值,我如何创建5个新变量来给出该行中前5个变量的列名?
例如。
max <- apply(sum_clus ,1, max)
for(ii in 1:10) sum_clus$max[ii] <- colnames(sum_clus)[which(sum_clus[ii , ]
== sum_clus[ii, sum_clus[ii,] == max[ii]])]上面的代码帮助我创建了一个变量sum_clus$max,它为我提供了每一行中最大变量的列名。类似地,我如何才能得到5个这样的变量,它们给出了前5个变量的列名?sum_clus$max、sum_clus$second_but_max等等..
提前感谢!
发布于 2013-05-15 03:37:39
这里有一个类似的解决方案,使用(i)循环而不是apply;(ii)使用rank而不是order。
set.seed(1)
n_i = 10
n_ii = 600
n_top = 5
df <- data.frame(matrix(runif(n_ii*n_i), ncol = n_ii))
out <- matrix("",n_top,n_i)
for (i in 1:n_i){
colranks <- rank(df[i,])
out[,i] <- names(sort(colranks)[n_ii:(n_ii-(n_top-1))])
}
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] "X369" "X321" "X348" "X415" "X169" "X258" "X55" "X182" "X99" "X78"
# [2,] "X42" "X295" "X563" "X173" "X377" "X31" "X246" "X353" "X259" "X384"
# [3,] "X98" "X440" "X371" "X207" "X429" "X292" "X433" "X437" "X123" "X558"
# [4,] "X13" "X193" "X396" "X78" "X543" "X228" "X211" "X2" "X583" "X508"
# [5,] "X35" "X364" "X249" "X33" "X388" "X405" "X458" "X252" "X569" "X456"与apply类似的一行代码是
apply(df,1,function(x)names(sort(rank(x))))[600:596,]发布于 2013-05-15 03:37:01
一种选择是使用order(),然后使用它来设置列名的子集,例如:
set.seed(1)
df <- data.frame(matrix(runif(600*10), ncol = 600))
foo <- function(x, names) {
ord <- order(x, decreasing = TRUE)[1:5]
names[ord]
}
nams <- colnames(df)
apply(df, 1, foo, names = nams)生产
> apply(df, 1, foo, names = nams)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "X369" "X321" "X348" "X415" "X169" "X258" "X55" "X182" "X99" "X78"
[2,] "X42" "X295" "X563" "X173" "X377" "X31" "X246" "X353" "X259" "X384"
[3,] "X98" "X440" "X371" "X207" "X429" "X292" "X433" "X437" "X123" "X558"
[4,] "X13" "X193" "X396" "X78" "X543" "X228" "X211" "X2" "X583" "X508"
[5,] "X35" "X364" "X249" "X33" "X388" "X405" "X458" "X252" "X569" "X456"检查此操作是否有效:
> names(sort(unlist(df[1,, drop = TRUE]), decreasing = TRUE)[1:5])
[1] "X369" "X42" "X98" "X13" "X35"
> names(sort(unlist(df[2,, drop = TRUE]), decreasing = TRUE)[1:5])
[1] "X321" "X295" "X440" "X193" "X364"看起来还行。
https://stackoverflow.com/questions/16551258
复制相似问题