【问题标题】:compare one list item against the rest in R将一个列表项与 R 中的其余项进行比较
【发布时间】:2012-05-26 16:19:26
【问题描述】:

如果你有一个文件列表,并且你想将 1 与一组其他文件进行比较,你会怎么做?

my.test <- list[1]
my.reference.set <- list[-1]

这当然可行,但我想在一个循环中使用它,my.test 每次都不同(因此列表中的每个文件都是 my.test 进行一次迭代,即我有一个包含 250 个文件的列表,并且我想对其中的 12 个文件的每个子集执行此操作。

> num <- (1:2)
> sdasd<- c("asds", "ksad", "nasd", "ksasd", "nadsd", "kasdih")
> splitlist<- split(sdasd, num)
> splitlist
$`1`
[1] "asds"  "nasd"  "nadsd"

$`2`
[1] "ksad"   "ksasd"  "kasdih"

> for (i in splitlist) {my.test <- splitlist[i] # "asds"
+ my.reference.set <- splitlist[-i] # "nasd" and "nadsd"
+ combined <- data.frame (my.test, my.reference.set)
+ combined}
Error in -i : invalid argument to unary operator
> 

那么我希望下一次迭代是,

my.test <- splitlist[i] #my.test to be "nasd"
my.reference.set <- splitlist[-i] # "asds" and "nadsd"
}

最后对于 splitlist[1],

my.test <- splitlist[i] # "nadsd" 
my.reference.set <- splitlist[-i] # "asds" and "ksad"
}

那么 splitlist[2] 也一样

【问题讨论】:

  • 如果你创建了可重复的例子,很可能有人会看一看。 (如果示例不可重现,我倾向于继续。)现在,您显然无法制作 250 个文件的可重现示例。但这没关系,因为您的问题是关于 250 项的列表。但它也可以是 5 个项目。因此,编写一些代码,其中包含 5 个项目的列表来说明您的问题。那我会试着理解你的问题。
  • 我详细阐述了我想做什么。
  • 好的,现在添加示例数据和预期结果。关键是“正确”的答案会产生您预期的结果。
  • 是的,我明白这一点。但这不是你问题的关键。尝试将您的问题概括为比较objects,而不是files。一旦你有了比较对象集的有效算法,就很容易修改它来比较文件。
  • 在某种意义上是可重现的,我们可以将其复制粘贴到 R 会话中并获得一个工作示例。

标签: r loops


【解决方案1】:

这是你想要的吗?这里的关键点是遍历列表的索引,而不是名称,因为x[-n] 索引仅在n 是自然数时才有效(有一些模糊的例外)。此外,我不确定您是否希望将结果作为数据框或列表 - 后者允许组件具有不同的长度。

num <- 1:2
sdasd <- c("asds", "ksad", "nasd", "ksasd", "nadsd", "kasdih")
splitlist<- split(sdasd, num)
L <- vector("list",length(splitlist))
for (i in seq_along(splitlist)) {
    my.test <- splitlist[[i]] # "asds"
    my.reference.set <- splitlist[-i] # "nasd" and "nadsd"
    L[[i]] <- list(test=my.test, ref.set=my.reference.set)
}

edit:我仍然对您上面的示例感到有些困惑,但我认为这就是您想要的:

refs <- lapply(splitlist,
     function(S) {
         lapply(seq_along(S),
            function(i) {
               list(test=S[i], ref.set=S[-i])
           })
     })

refs 是一个嵌套列表;顶层的长度为 2(splitlist 的长度),下一层的长度为 3(splitslist 的元素长度),每个底层的长度为 2(测试集和参考集) .

【讨论】:

  • 这似乎将 my.test 定义为多个字符串,即“ksad”、“ksasd”和“kasdih”。正如我在新编辑的帖子中所展示的那样,我希望它一次只有一个。
  • 这正是我想要的!我永远也写不出来……非常感谢本!
  • @pepsimax 如果这个答案有帮助,那么您真的应该考虑接受它,方法是单击答案分数下方的勾号。这会给回答您的问题的人带来声誉(SO 货币),并且您的代表也会增加 2 分。
  • 哦,是的,对不起。做过某事。我希望有一天我可以回答一个问题来报答!
  • @pepsimax 干得好。你也应该开始投票选出你的问题的答案。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多