【问题标题】:R: Replicating a loop or function multiple times and adding results to data frame for each timeR:多次复制循环或函数并将结果添加到数据帧中
【发布时间】:2013-03-28 21:16:51
【问题描述】:

我编写了一个 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

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 输出每行的排名和。每行中的名称 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 次时附加秩和列,并将所有结果转换为可以工作的数据帧。因此,如果有人可以帮助我完成这项任务,那就太好了

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案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 循环之外,否则函数会在处理完第一列后退出。

    上面的代码仍然不是很有效,因为在每次迭代中,您都会多次替换整个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)
    }
    

    【讨论】:

    • 谢谢。最终没有完全使用该代码,但它确实对我有用!
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2023-04-04
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多