我有一个数据框c1,如下所示:
str(c1)
#'data.frame': 2312 obs. of 6 variables:
# $ dt : Date, format: "2014-04-01" "2014-04-01" "2014-04-01" ...
# $ base : Factor w/ 2 levels "AA","AB": 1 1 1 2 2 2 2 1 1 1 ...
# $ curr : Factor w/ 5 levels "BA","BB","BC",..: 2 3 5 1 2 3 4 2 3 5 ...
# $ trans: int 72 176 4365 234 144 352 16762 61 160 4276 ...
# $ amt : num 2.18e+09 5.55e+09 9.99e+09 3.75e+08 4.37e+09 ...
# $ rate : num 1.11e-04 1.22e-02 1.26 3.94 5.65e+03 ...
d = "c1"
d
# [1] "c1"
现在,我使用d而不是实际的数据框名称,它不能正常工作-
i <- sapply( c1, is.factor)
i
# dt base curr trans amt rate
#FALSE TRUE TRUE FALSE FALSE FALSE
对,是这样!
i <- sapply( paste(d), is.factor)
i
# c1
#FALSE
不正确
i <- sapply( noquote(d), is.factor)
i
# c1
#FALSE
不正确
有没有办法解决这个问题?
编辑-
c1[i] <- lapply(c1[i], as.character)
作品
get(d)[i] <- lapply( get(d)[i], as.character)
失败
for (j in 1:length(i)) { ifelse(is.factor(get(d)[j]),get(d)[i] <- as.character(get(d)[i])) }
失败
可以在任何地方使用get,还是有3/4的方法可以使用get()
再次感谢
发布于 2015-08-03 16:54:53
如果我没理解错的话,你要找的是
xy <- data.frame(a = runif(3), b = letters[1:3])
sapply(get("xy"), is.factor)
请注意,这是一种糟糕的做法。如果您正在动态地创建变量名,则应该考虑使用其他对象,如列表,来存储data.frame。
发布于 2015-08-04 11:44:46
目前,这是可行的。尽管这很难理解。
.eval <- function(evaltext,envir=sys.frame()) {
## evaluate a string as R code
eval(parse(text=evaltext), envir=envir)
}
.eval(paste( "i = sapply(",noquote(d),",is.factor)",sep=""))
.eval(paste( noquote(d),"[i] <- lapply(",noquote(d),"[i], as.character)",sep=""))
我仍然在寻找更好的替代方案。这太糟糕了,我不能接受这个答案:-(
谢谢,曼尼什
https://stackoverflow.com/questions/31783109
复制相似问题