在 R 中,如何根据函数内部的值列表正确地对数据框进行子集化?

亚当·普莱斯

我有一个函数试图根据值列表从数据框中选择行。

例如,一些值可能是:

> 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据R中两列不匹配的值对数据框进行子集化?

如何根据R中的多个变量对数据框进行子集化

如何根据多个联合条件在 R 中对数据框进行子集化

如何使用R函数对数据框进行子集化,并在以后使用该数据框?

想要通过在循环中对数据框进行子集化并根据 i 值分配每个数据框名称来在 R 中创建新数据框

根据r中id中的值对数据进行子集

如何正确地限定 R 中的数据框以与函数中的公式一起使用

从 R 中的函数内对数据进行子集化

如何根据R中列名中的数字条件对数据进行子集化?

在 R 中,如何根据向量中的值对数据帧的行进行子集

R:如何对数据框列中的字符串进行子集化?

你如何从 R 中的列表中对数据进行子集化?

使用 case_when() 和 filter() 根据 R 中一列中的值和另一列中的级别对数据框进行子集化

如何根据日期正确地对变量求和并将结果保存在R中的单独数据框中

根据R中的多个通配符条件对数据框进行子集

如何根据下一次出现在R中对数据帧进行子集化?

R:你如何对列表中的所有数据框进行子集化?

如何使用基于R中最近位置的坐标对数据框中的行进行子集化

根据R中的某些条件对数据帧进行子集

R-为什么在另一个数据框中搜索值时,却在该数据框中正确地返回列表?

R-如何使用整数索引对数据框的行进行子集化?

R 数据框:如何根据另一列中不同值的列值对数据进行切片

根据行值子集数据框并在 R 中创建新数据框列表

如何根据列表中的值对数据框进行子集化?

在 R 中对数据集进行子集化

R:根据日期列在另一列的因子级别内对数据框进行子集化

如何使用R根据数据框中单个列的最小值对特定列中的行进行子集

根据列中的元素对 R 中的数据框进行子集化

如何按日期对数据进行子集化并在R中执行多项操作?