我有一个数据框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])) }
失败
可以在每个地方使用或有3/4种方式使用get()
再次感谢
答案 0 :(得分:2)
如果我理解正确,你正在寻找
xy <- data.frame(a = runif(3), b = letters[1:3])
sapply(get("xy"), is.factor)
请注意,这是不好的做法。如果您正在动态编写变量名称,则应考虑使用其他对象(如列表)来存储data.frame(s)。
答案 1 :(得分:-1)
这适用于现在。虽然它的理解非常糟糕。
.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=""))
我仍在寻找更好的选择。这太糟糕了,我不能接受这个答案: - (
谢谢,Manish