1

我编写了一个 R 循环并将其转换为一个接收数据帧的函数,原始代码和数据帧如下。目标是重复这个函数或循环 1000 次,最终得到一个数据框,该数据框有 1000 列代表每个 row.name 的行和。

我的目标是看起来像这样的数据框

row.names   rsum_s1  rsum_s2  rsum_s3  rsum_s4.....rsum_s1000 
kc231       40       57       15       34
kc25498     34       39       567      23
kc087398    28       3747     25       1938

x 是原始数据框,它看起来像这样:

row.names   val2        val4        val3        val4
kc231       1.62E-08    3.29E-37    1.36E-14    0.29692426
kc25498     4.93E-01    4.93E-01    4.93E-01    0.49330053
kc087398    3.50E-01    1.18E-22    1.71E-08    0.35011743

循环我第一次写作品给我 rsum_s 作为一个列表。

  for(k in 1:length(colnames(x))) {  
        as.numeric(x[,k])
        sample(x[,k])
        x[,k]<-rank(x[,k],ties.method="min")
        rsum_s<-rowSums(x)

LOOP 的输出是每行的排名和。每行中的名称 id:rsum_s

structure(c(47, 142, 82), .Names = c("kc231", "kc25498", "kc087398"))

LOOP 转换为 FUNCTION

sim<-function(x) { #takes a data.frame
  for(k in 1:length(colnames(x))) {  #each column set as numeric
    as.numeric(x[,k])
    sample(x[,k])  #randomly shuffle values in each column
    x[,k]<-rank(x[,k],ties.method="min") #rank each randomly shuffled columns
    rsum_s<-rowSums(x) #take the sum of the rows
    return(rsum_s)
    }
}

函数的结果是整数而不是整数。

sim(dataframe1)
kc231   kc25498 kc087398
18.24   37.47   32.350117 

我不确定我在这里做错了什么。我需要执行 1000 次循环,并在每次循环运行到数据帧或复制函数 sim 1000 次时附加秩和列,并将所有结果转换为可以工作的数据帧。因此,如果有人可以帮助我完成这项任务,那就太好了

任何帮助深表感谢。

4

1 回答 1

1

我想这就是你要写的:

sim <- function(x) { #takes a data.frame
  for(k in 1:ncol(x)) {  #each column set as numeric
    x[,k] <- as.numeric(x[, k])
    x[,k] <- sample(x[, k])  #randomly shuffle values in each column
    x[,k] <- rank(x[, k], ties.method = "min") #rank each randomly shuffled columns
  }
  rsum_s <- rowSums(x) #take the sum of the rows
  return(rsum_s)  
}

你做错的一些事情:

  1. as.numeric除非你分配结果,sample否则没有效果,但最重要的是
  2. 和必须移到循环外的末尾,rowSums否则函数将在处理完第一列后退出。returnfor

x上面的代码仍然不是很有效,因为在每次迭代中,您都要多次替换整个代码。我建议您查看apply功能系列,执行以下操作:

sim <- function(x) {
    fun <- function(z) rank(sample(as.numeric(z)), ties.method = "min")
    y   <- as.data.frame(lapply(x, process.one.col))
    rownames(y) <- rownames(x)
    rowSums(y)
}
于 2013-04-06T13:13:38.807 回答