我有一个函数试图根据值列表从数据框中选择行。
例如,一些值可能是:
> subset_ids
[1] "JUL_0003_rep1" "JUL_0003_rep2"
[3] "JUL_0003_rep3" "JUL_0007_rep1"
[5] "JUL_0007_rep2" "JUL_0007_rep3"
我有一个名为“目标”的数据框,其中有一列名为“LongName”。它有许多其他列,但没什么大不了的。当 LongName 在子集 ID 中时,我想从目标中选择行。
我可以通过以下任一方式做到这一点:
targets[is.element(targets$LongName, subset_ids),]
或者
targets[targets$LongName %in% subset_ids,]
问题是我想在一个函数中做这个,不知道会提前调用什么列。
所以我尝试使用 eval/parse 方法,根据最近的阅读,这可能不是最好的方法。当我执行以下操作时:
sub1 <- paste("targets[is.element(targets$", column_name, ", subset_ids),]", sep="")
targets_subset <- as.character(eval(parse(text = sub1)))
它返回一些奇怪的行号串联。它看起来像这样:
[1] "c(5, 6, 7, 17, 18, 19, 26, 27, 28, 35, 36, 46, 47, 48, 54, 55, 61, 62, 63, 64, 73, 74, 75, 76, 77, 78, 91, 92, 93, 102, 103, 104, 114, 117, 118, 129, 136, 137, 140, 141, 151, 152, 153, 157, 158, 159, 169, 172, 173, 183, 187, 188, 199, 200, 201, 208, 209, 210, 232, 233, 241, 242, 243, 252, 253, 254, 264, 265, 270, 271, 285, 286, 296, 297, 298)"
[2] "c(5, 6, 7, 17, 18, 19, 26, 27, 28, 35, 36, 46, 47, 48, 54, 55, 61, 62, 63, 64, 73, 74, 75, 76, 77, 78, 91, 92, 93, 102, 103, 104, 114, 117, 118, 129, 136, 137, 140, 141, 151, 152, 153, 157, 158, 159, 169, 172, 173, 183, 187, 188, 199, 200, 201, 208, 209, 210, 232, 233, 241, 242, 243, 252, 253, 254, 264, 265, 270, 271, 285, 286, 296, 297, 298)"
[3] "c(3, 3, 3, 7, 7, 7, 11, 11, 11, 15, 15, 19, 19, 19, 22, 22, 26, 26, 27, 27, 31, 31, 31, 32, 32, 32, 39, 39, 39, 43, 43, 43, 47, 49, 49, 53, 57, 57, 59, 59, 63, 63, 63, 65, 65, 65, 70, 72, 72, 76, 78, 78, 83, 83, 83, 86, 86, 86, 97, 97, 100, 100, 100, 104, 104, 104, 108, 108, 111, 111, 117, 117, 121, 121, 121)"
所以 5, 6, 7, 17 ... 似乎是我要选择的目标的正确行,但我不明白为什么它首先将其发回,或者项目 [3] 是什么根本。
如果我手动执行上面“sub1 <- ...”生成的行,那么它会返回正确的数据。如果我要求函数执行此操作,它会返回这些垃圾。
我的问题有两个方面。1:为什么数据是这样返回的?2:有没有比 eval/parse 更好的方法来做我想做的事情?
我怀疑有一些奇怪的范围或环境级别的问题,但目前我还不清楚。我感谢任何人的任何建议。
数据以这种方式返回,因为您将数据帧强制转换为字符对象。尝试
as.character(head(targets))
看一个简短的例子。
因此,如果您消除as.character()
. 这是一个 MWE:
targets <- data.frame(LongName = sample(letters, 1000, replace = TRUE),
SeqNum= 1:1000,
X = rnorm(1000))
subset_ids <- c("a","f")
targets[is.element(targets$LongName, subset_ids),]
targets[targets$LongName %in% subset_ids,]
testfun <- function(targets, column_name, subset_ids){
sub1 <- paste("targets[is.element(targets$", column_name, ", subset_ids),]", sep="")
targets_subset <- eval(parse(text = sub1))
return(targets_subset)
}
testfun(targets, column_name = "LongName", subset_ids)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句