删除并在列表中放置另一个向量中不存在的向量元素

时间:2015-05-14 12:11:29

标签: r

我正在尝试形成在reshape()函数中使用的参数。我有一个列名称的向量,其中一些应该由reshape()合并,因为它们在末尾共享相同的字母:

> v <- c("x","da","db","ea","eb","ec","fb")

这些列中的大多数都包含prepost个字符的组合。 pre参数为timevarpost v.names参数为reshape()。它们被定义为:

> pre <- c("d","e","f")
> post <- c("a","b","c")

我已经以这种方式组织了问题,因为我需要为不同的文件执行此操作的列数可变。通过解析像这样的列名,我确信我可以用算法而不是手动黑客来做到这一点。

我想要的输出是一个向量列表,它只包含共享相同v个字母的post元素。目的是将这些用作varying中的reshape()参数:

> desired_lov
$a
[1] "da" "ea"

$b
[1] "db" "eb" "fb"

此外,我想跟踪原始desired_lov向量中仍然存在的v中缺少哪些元素。目的是将这些用作idvar中的reshape()参数:

> desired_idh
[1] "x" "ec"

有了这些,有人帮我构建了一个带有可能列名的向量列表,其中包含这些前缀和后缀。此列表中的每个向量都以post中的元素命名,我相信这对于reshape()来说很重要,因为它将以通用名称合并每个向量中的列:< / p>

> lov <- Map(function(x) paste0(pre,x),post)
> lov
$a
[1] "da" "ea" "fa"

$b
[1] "db" "eb" "fb"

$c
[1] "dc" "ec" "fc"

除此之外,这些组合构建的名称多于v中实际存在的名称。所以我想跟踪vlov中哪些名称不存在,我已尝试过这些名称:

> idh <- NULL
> Map(function(x) idh <- paste(idh,lov[[x]][lov[[x]] %in% v]),1:length(lov))
[[1]]
[1] " da" " ea"

[[2]]
[1] " db" " eb" " fb"

[[3]]
[1] " ec"

> idh
NULL

除了显然我没有成功使用idh修改Map()变量

对于下一步(在我弄清楚上面的位之后),为了去除与lov不匹配的v元素,我尝试过:

>  Map(function(x) lov[[x]] <- lov[[x]][lov[[x]] %in% v],1:length(lov))
[[1]]
[1] "da" "ea"

[[2]]
[1] "db" "eb" "fb"

[[3]]
[1] "ec"

> lov
$a
[1] "da" "ea" "fa"

$b
[1] "db" "eb" "fb"

$c
[1] "dc" "ec" "fc"

这给了我很有前途的输出(我需要从列表中删除长度<2的所有向量,因为我只是根据他们的第二个字符查找重复的列),但是再次无法实际修改{ {1}}删除我试图删除的元素。

我尝试过搜索,但我一直在寻找的方法是删除向量元素。这似乎是一个非常不同的问题,因为我试图从列表中嵌入的多个向量中删除元素,同时尝试保留该列表中的向量名称。

编辑:我提前知道lov,所以我可以在需要的地方手动排除它。但我不知道x是一个独特的postfix(在这个特定的例子中),因此需要在脚本中确定。

1 个答案:

答案 0 :(得分:1)

freq <- lapply(Map(function(x) grep(x, v), post), length)
index <- Map(function(x) grep(x, v), names(freq)[freq>1])
lapply(index, function(x) v[x])
$a
[1] "da" "ea"

$b
[1] "db" "eb" "fb"

v[-unlist(index)]
[1] "x"  "ec"

数据

v <- c("x","da","db","ea","eb","ec","fb")
pre <- c("d","e","f")
post <- c("a","b","c")