0

我有以下示例数据

    BR WT   SW   PO
1  4.0  7  2.0  1.0
2 12.0  5  4.0  2.0
3  8.0  7  5.0  8.6
4  9.0  3  5.6  9.0
5  1.0 10  6.0  5.0
6  6.0  2  7.5 12.0
7  7.0  3 10.0 15.0
8  4.5 10 12.0  6.0

我要做的是首先浏览每一列数据,并在每一列中:

(a) 相对于整列对每个值进行排名,以及

(b) 计算列中的观察总数。

然后,对于每一列,我尝试做一个数学表达式,即“rank/(count+1)”,并将该结果分配给一个变量。到目前为止,这是此示例数据框(“df”)的代码。

    for (i in 1:ncol(df)) {
      assign(paste("x",i,sep=""),rank(-df[,i],ties.method="first"))
      assign(paste("y",i,sep=""),length(df[,i]))
      assign(paste("z",i,sep=""),(x[i]/(y[i]+1)))
    }

当我对每个“分配”行进行故障排除时,“x”和“y”变量工作正常:

> x1
[1] 7 1 3 2 8 5 4 6

> x2
[1] 3 5 4 6 1 8 7 2

> x3
[1] 8 7 6 5 4 3 2 1

> x4
[1] 8 7 4 3 6 2 1 5

y1:4(在这种情况下)工作正常,结果都是 8。但是,x[i]/(y[i]+1) 的运算会导致以下错误:

Error in assign(paste("z", i, sep = ""), (x[i]/(y[i] + 1))) : 
  object 'y' not found

有人有想法么?一旦我计算出这个新的“z[i]”值,我如何使用这些 z 值创建一个新的数据框,以便我可以继续使用 ggplot?

4

1 回答 1

2

是否有理由必须将其作为一个循环来完成无论如何,使用您的数据

dat <- read.table(text = "    BR WT   SW   PO
1  4.0  7  2.0  1.0
2 12.0  5  4.0  2.0
3  8.0  7  5.0  8.6
4  9.0  3  5.6  9.0
5  1.0 10  6.0  5.0
6  6.0  2  7.5 12.0
7  7.0  3 10.0 15.0
8  4.5 10 12.0  6.0", header = TRUE)

这将返回排名

r <- sapply(dat, function(x) rank(-x, ties.method = "first"))

> r
     BR WT SW PO
[1,]  7  3  8  8
[2,]  1  5  7  7
[3,]  3  4  6  4
[4,]  2  6  5  3
[5,]  8  1  4  6
[6,]  5  8  3  2
[7,]  4  7  2  1
[8,]  6  2  1  5

length(dat[, i])所有 相同i,并且由 给出nrow(dat),您可以忽略 的分配y并直接转到最后一个操作:

> r / (nrow(dat) + 1)
            BR        WT        SW        PO
[1,] 0.7777778 0.3333333 0.8888889 0.8888889
[2,] 0.1111111 0.5555556 0.7777778 0.7777778
[3,] 0.3333333 0.4444444 0.6666667 0.4444444
[4,] 0.2222222 0.6666667 0.5555556 0.3333333
[5,] 0.8888889 0.1111111 0.4444444 0.6666667
[6,] 0.5555556 0.8888889 0.3333333 0.2222222
[7,] 0.4444444 0.7777778 0.2222222 0.1111111
[8,] 0.6666667 0.2222222 0.1111111 0.5555556

假设我理解你当然想做什么......

于 2013-04-09T20:46:43.627 回答