2017-05-10 9 views
2

私の質問は2倍です。には、データフレームオブジェクトを名前として割り当てますか?ループスルー機能

df1 <- data.frame(k1 = runif(6, min=0, max=100), 
      k2 = runif(6, min=0, max=100), 
      k3 = runif(6, min=0, max=100), 
      k4 = runif(6, min=0, max=100)) 
df2 <- data.frame(k1 = runif(6, min=0, max=100), 
       k2 = runif(6, min=0, max=100), 
       k3 = runif(6, min=0, max=100), 
       k4 = runif(6, min=0, max=100)) 
df3 <- data.frame(k1 = runif(6, min=0, max=100), 
       k2 = runif(6, min=0, max=100), 
       k3 = runif(6, min=0, max=100), 
       k4 = runif(6, min=0, max=100)) 

私は再フォーマットして、この機能を使用して、各データフレームの一部の名前を変更したいと思います:第一に、これらの3つのデータ・フレームを与え

samplelist<-c("k2", "k4") 

draft_fxn<-function(x, obj_name){ 
    x.selected<-x[,c(samplelist)] #select columns of choice 
    colnames(x.selected)[1:2]<-paste(obj_name, colnames(x.selected), sep="_") #rename columns so they include original data frame name 
    return(x.selected) 
} 

#Example run and output: 
df2_final<-draft_fxn(df2, "df2") 
#output from: 
head(df2_final[1:2],) 
>  df2_k2 df2_k4 
>1 5.240274 53.03423 
>2 5.042926 34.78974 

最初の質問:私は私の機能を変更することができますどのように着るので、 'df2、df2' 'と入力してください。私のdraft_fxnコードでは、 "obj_name"を入力データフレームの名前に置き換えたいと思っています。私の例では "df2"です。

2番目の質問:どのように私のすべてのデータフレームをループすることができますか?おそらく、これはforループと似ていますか?あなたは、関数のsamplelist外を定義して、内部にそれを呼び出しているので OBJS < -c(DF1、DF2、DF3)

for (file in objs){ 
    out<-draft_fxn(file); return(out) 
} #this doesn't work though. 
+1

[データのリストを保持する] http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)よりもむしろ、あまり関係のない変数の束を変数名の中に置くのではなく自体。 – MrFlick

答えて

3

をあなたの最初の質問に答えるために:あなたはdeparse(substitute(x))を使用してオブジェクトxの名前を取得することができます。だからあなたの関数から引数obj_nameを排除するために、あなたは、複数のデータフレームのために、このような操作を実行したい場合、あなたは通常、リストに入れ、その後lapplyでしょう、あなたの2番目の質問については

draft_fxn <- function(x){ 
    obj_name <- deparse(substitute(x)) 
    x.selected<-x[,c(samplelist)] 
    colnames(x.selected)[1:2]<-paste(obj_name, colnames(x.selected), sep="_") #rename columns so they include original data frame name 
    return(x.selected) 
} 

を使用することができます関数。ただし、データフレームをリストに入れると、オブジェクト名が変更されます。つまり、deparse(substitute(x))が個々のデータフレームの名前の代わりにX[[i]]_を返しても、この場合は機能しません。ループでそれをやりたいのであれば、データフレームの名前のベクトルを渡す別のアプローチを提案します:

## Names of the relevant data frames: 
objNames <- c("df1", "df2", "df3") 
## Function to rename the specified columns: 
renameFun <- function(xString){ 
    x <- get(xString)[,c(samplelist)] 
    colnames(x) <- paste(xString, samplelist, sep = "_") 
    x 
} 

## Apply function to all data frames specifed by objNames: 
lapply(objNames, renameFun) 
# [[1]] 
#  df1_k2 df1_k4 
# 1 54.232123 2.178375 
# 2 16.816784 23.586760 
# 3 6.612874 16.509340 
# 4 92.399588 71.133637 
# 5 22.917838 8.127079 
# 6 43.563411 21.118758 
# 
# ... 
2

だからあなたの関数は、よく指定されていません。その問題は、samplelistが定義されていないと、関数がエラーを返します。つまり、自己完結型ではありません。 (それは肯定し、データフレームの列数よりも大きくないん限り)cols引数が異なることを

draft_fxn<-function(x, cols =...){ 
    x.selected<-data.frame(x[, cols]) #select columns of choice 
    colnames(x.selected)<-paste(deparse(substitute(x)), colnames(x.selected), sep="_") #rename columns so they include original data frame name 
    return(x.selected) 
} 

注:

は、ここでの代替です。

これが返されます。

> df2_final<- draft_fxn(df2, cols = c("k2", "k4")) 
> head(df2_final)[1:2,] 
    df2_k2 df2_k4 
1 21.62533 2.256182 
2 64.83556 67.705705 
関連する問題