eval parse在我的函数中工作不正常
我有以下数据集,其中包括2个变量:eval parse在我的函数中工作不正常,r,function,labels,levels,R,Function,Labels,Levels,我有以下数据集,其中包括2个变量: 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命令中提供的列表如下,分别表示数据集中每个变量的有序级别: label_list=list("'S','SA','
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命令中提供的列表如下,分别表示数据集中每个变量的有序级别:
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))
df_name=“dt4”
df=dt4
级别列表=级别列表
标签列表=标签列表
i=3
df[]。在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
}
将\u标签\u级别\u添加到\u数据集。在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
}
Add_Labels_Level_To_Dataset这是一个。我同意@MrFlick的观点,应该避免解析。
在最初的帖子中,主要问题是函数应该返回dt4
,而不是df
。定义标签列表时缺少一些”
(单引号)
我们可以使用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
这是一个很好的例子。我同意@MrFlick的观点,应该避免解析。
在最初的帖子中,主要问题是函数应该返回dt4
,而不是df
。定义标签列表时缺少一些”
(单引号)
我们可以使用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
我认为你的回答更优雅/有效/简短。然而,为什么str()命令会显示factors而不是ord.factors当我应用你的R命令时,它会显示ord.factors@Marcelo?@Elias我已经更新了答案。将SIMPLIFY=F
添加到mapply
将保留有序因子类。我认为您的回答更优雅/高效/简短。然而,为什么str()命令会显示factors而不是ord.factors当我应用你的R命令时,它会显示ord.factors@Marcelo?@Elias我已经更新了答案。将SIMPLIFY=F
添加到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