2017-05-30 11 views
0

では正常に動作していない私は、2つの変数が含まれ、次のデータセットがいる:evalの解析には、私の機能

Add_Labels_Level_To_Dataset <- function(df, df_name,levels_list,labels_list) { 
    df[] <- lapply(df, ordered) 
    for (i in 1:length(colnames(df))) { 
    arg0<-paste0(df_name,"[i]", "<-ordered(", df_name, "$'", colnames(df)[i], "', levels=c(", levels_list[[i]], "), labels = c(", labels_list[[i]],"))" ) 
    eval(parse(text=arg0)) 
     } 
df 
    } 

dt4<-structure(list(a1 = c(4L, 4L, 3L, 4L, 4L), a2 = c(1L, 
3L, 4L, 5L, 4L)), .Names = c("a1", "a2" 
), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame" 
)) 

を私は既存のデータセットにラベルやレベルを追加し、以下の機能を持っていますそのRコマンドによって実行される

Add_Labels_Level_To_Dataset(dt4, "dt4", level_list, labels_list) 

Rコマンドで提供されるリストは、foそれぞれデータセット内の各変数の順序付きレベルを表しています。

label_list=list("'S','SA','SB','SC,'SD'", "'S','SA','SB','SC,'SD'") 
level_list=list("5,4,3,2,1", "5,4,3,2,1") 

なぜ私の機能が正しく動作していませんか? 私は何が間違っているのか知りません! Rコマンドの外でRコマンドを実行すると、レベル/ラベルを与えられたデータセットに結び付けます。しかし、R関数を実行すると、これは起こりません!

df_name="dt4" 
    df=dt4 
    levels_list=level_list 
    labels_list=label_list 
    i=3 

    df[] <- lapply(df, ordered) 
      arg0<-paste0(df_name,"[i]", "<-ordered(", df_name, "$'", colnames(df)[i], "', levels=c(", levels_list[[i]], "), labels = c(", labels_list[[i]],"))" ) 
       eval(parse(text=arg0)) 

助けてもらえますか?

答えて

1

これはxy problemです。 @MrFlickには、解析を避けるべきだと私は同意する。 元の投稿では、主な問題は関数がdt4を返すはずであり、dfではないことです。 label_listを定義するときに、'(一重引用符)が見つからないことがあります。

我々はmapplyを使用して、単一引用符を避けることができます:

label_list=list(c('S','SA','SB','SC','SD'), c('S','SA','SB','SC','SD')) 
level_list=list(c(5,4,3,2,1), c(5,4,3,2,1)) 

as.data.frame(mapply(function(x, labels,levels) {ordered(x, labels,levels)}, dt4, level_list, label_list, SIMPLIFY = F)) 
# a1 a2 
#1 SA SD 
#2 SA SB 
#3 SB SA 
#4 SA S 
#5 SA SA 
+0

を私はもっとエレガント/効率的/短い答えとしてあなたのresponceを可決しました。しかし、なぜ私はあなたのRコマンドを適用したときにstr()コマンドが要因とord.factorsではないと言う - 私のRコマンドを適用すると、ord.factors @マーセル? –

+1

@Elias答えを更新しました。 'mapply'に' SIMPLIFY = F'を加えると、順序付けられた因子クラスが保存されます。 – Marcelo

1

Using eval/parse should be avoided。そこには、このコードで、私達はちょうど

Add_Labels_Level_To_Dataset <- function(df, levels_list, labels_list) { 
    df[] <- Map(function(data, levels, labels) { 
    ordered(data, levels=strsplit(levels,",")[[1]], labels=strsplit(labels, ",")[[1]]) 
    }, df, levels_list, labels_list) 
    df 
} 

を書くことができ、例えばR.でやりたいtpyicallyはるかに簡単な方法があり、私たちはそれを返すこと

dt4 <- Add_Labels_Level_To_Dataset(dt4, level_list, label_list) 

ノートのようにそれを呼び出すことができます新しいdata.frameをdt4またはその他の変数に再割り当てできます。 Rの関数は、自分自身のスコープの外にあるオブジェクトを決して変更してはいけません。それは、あなたが関数に問題を起こしている他の理由の1つです。

関連する問題