我有一个数据框,我想在其上执行以下操作:
1)根据ceratin列(包含数字数据)重新提取数据框。
2)在数据框中添加一列,根据我以前订购的列的顺序为每一行分配一个数字。
3)通过rownames重新排序数据框:我需要这个,因为我想使用不同的列多次应用步骤1-2,并且我不希望在运行之间保留上一次运行的顺序。
我写了一个能做我想要的功能:
globalQ<-function(df,x){
df<-df[order(df[,x]),]
leng<-length(which(is.na(df[,x])==FALSE))
lengu<-as.integer((leng)/6)
qvec<-c(rep(1,lengu),rep(2,lengu),rep(3,leng-5*lengu),rep(4,lengu),rep(5,lengu), rep(6,lengu),rep(NA, times=nrow(df)-leng))
df$name<-qvec
df
}
一次适用于一列,请说: DF&LT; -globalQ(exProbes,14)
但我想使用几个不同的列来执行此操作,一次调用一列上的函数。
我想我需要的是apply()的某个版本,但我不知道如何使用数据框和单列的函数来调用apply()。
顺便说一句,我知道在mutiply列上调用此函数会在它将创建的新列上创建一个名称redundancycny。我稍后会处理。提前致谢
答案 0 :(得分:0)
每次调用函数时都无需对数据帧进行排序。您可以按照这样的顺序返回结果,以便cbind
将其输出到原始数据框并稍后再订购。像这样:
qvec<-function(y){
leng<-sum(!is.na(y))
lengu<-as.integer((leng)/6)
qvec<-c(rep(1:2,each=lengu),rep(3,leng-5*lengu),rep(4:6,each=lengu),rep(NA,length(y)-leng))
qvec[order(order(y))]
}
with(mtcars, cbind(mtcars, name1=qvec(cyl), name2=qvec(disp))[order(cyl, disp),])
要使用列索引的任意向量(indices
)以及稍后按行名称排序来调用它,请使用以下内容:
result <- mtcars
for(i in indices) result <- cbind(result, qvec(mtcars[,i]))
result[order(rownames(mtcars)),]
答案 1 :(得分:0)
## for example,1's,2's,4's column is what you need,exProbes is your matrix
indices<-c(1,2,4)
x<-globalQ(exProbes,indices[1])
if (length(indices)>1) {
for (i in indices[-1]) {
x<-data.frame(x,globalQ(exProbes,i))
}
}