2013-04-06 45 views
1

我已经写了一个R循环,并将它变成了一个接收数据帧的函数,原始代码和数据帧如下所示。我们的目标是重复这个函数或循环1000次,最终得到一个数据框,其中有1000列表示每个row.name的rowsums。R:多次复制一个循环或函数并将结果添加到数据帧中每次

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

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为一个列表。 LOOP的

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) 

输出等级总和为每行中的每个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次,并将每次循环运行时的等级总和列追加到数据帧或复制功能模拟1000次,并将所有结果转换为可以工作的数据帧。所以如果任何人都可以帮助我完成这项任务,那就太好了

任何帮助都非常感谢。

回答

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循环之外,否则函数将在处理第一个co之后退出lumn。

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

谢谢。并没有完全使用该代码,但它确实对我有用! – CadisEtRama 2013-04-06 19:12:31

相关问题