我已经编写了一个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次时附加秩和的列,并将所有结果转换为可以工作的数据帧。所以,如果有人能帮助我完成这项任务,那就太棒了
非常感谢任何帮助。
答案 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)
}
你做错了一些事情:
as.numeric
和sample
无效,但最重要的是rowSums
和return
必须移到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)
}