R:多次复制循环或函数,并将结果添加到数据帧中

时间:2013-04-06 12:50:58

标签: r for-loop user-defined-functions random-sample replicate

我已经编写了一个R循环并将其转换为一个接收数据帧的函数,原始代码和数据框如下所示。目标是重复此函数或循环1000次,最后得到一个数据框,其中有1000列代表每行的名称.name。

MY GOAL,是一个看起来像这样的数据框

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

LOOP我首先写了作品给我作为列表的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的输出每行中每个row.name 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次时附加秩和的列,并将所有结果转换为可以工作的数据帧。所以,如果有人能帮助我完成这项任务,那就太棒了

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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.numericsample无效,但最重要的是
  2. rowSumsreturn必须移到for循环之外的末尾,否则函数会在处理完第一列后退出。
  3. 上面的代码仍然不是很有效,因为在每次迭代中,您将多次替换整个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)
    }