粘贴/ NoQuote - 未按预期工作

时间:2015-08-03 08:49:50

标签: r

我有一个数据框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()

再次感谢

2 个答案:

答案 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