r使用apply命令数据框

时间:2013-08-29 14:56:44

标签: r dataframe apply

我有一个数据框,我想在其上执行以下操作:

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。我稍后会处理。

提前致谢

2 个答案:

答案 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)) 
    }
}