2017-05-30 74 views
0

我有以下的數據集,其中包括2個變量:EVAL分析是不是在我的功能正常工作

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" 
)) 

我有以下功能標籤和級別添加到現有的數據集:

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 
    } 
由該R命令運行的

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

在R命令中提供的列表是fo llowing的,這表示每個變量的有序水平的數據集分別爲:

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

我投了你的性反應作爲一種更優雅/高效/更短的答案。然而,當我應用你的R命令時,爲什麼str()命令說的是因素而不是ord.factors - 當應用我的R命令時,它說ord.factors @Marcelo? –

+1

@Elias我已經更新了答案。將'SIMPLIFY = F'添加到'mapply'將保留排序的因子類別。 – Marcelo

1

Using eval/parse should be avoided。有tpyically更容易的方式去做你在R.想要的東西。例如,與此代碼,我們可以只寫

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 
} 

而且我們可以把它像

dt4 <- Add_Labels_Level_To_Dataset(dt4, level_list, label_list) 

注意,它返回一個新的數據幀,你可以重新分配到dt4或其他一些變量。 R中的函數不應該修改超出其範圍的對象,這是您遇到函數問題的其他原因之一。