【问题标题】:How to create a list inside a list, using elements from one vector, in r如何在列表中创建列表,使用来自一个向量的元素,在 r
【发布时间】:2019-08-30 22:12:00
【问题描述】:

我正在尝试使用 R 中的单个向量在列表中创建列表。

我有矢量

Conditions = c('A', 'B', 'C', 'D')

我想要一个包含 A、B、C 和 D 的列表(没问题)。但我也希望这些是包含四个项目的列表,名称如下:A vs AA vs B、...D vs CD vs D,最终得到一个包含四个列表(A、B 、C 和 D)每个都包含四个我可以添加数据框的列表(“vs”列表)。

基本上我想要这样的东西:

My list
 |
 |
 |        /- A vs A       /- B vs A      /- C vs A      /- D vs A
 |       /               /              /              /
 |      /- A vs B       /- B vs B      /- C vs B      /- D vs B
 |     /               /              /              /
 ---A-|-------------B-|------------C-|------------D-|                       
       \               \              \              \
        \ - A vs C      \ - B vs C     \ - C vs C     \ - D vs C
         \               \              \              \  
          \- A vs D       \- B vs D      \- C vs D      \- D vs D

这是我尝试过的:

Conditions <- c('A', 'B', 'C', 'D')

MyList <- as.list(Conditions) 

for(i in 1:length(MyList)) {
    for(i in 1:length(Conditions)) {
    MyList[i] <- list(paste(MyList[i], 'vs', Conditions[i]))
  }
}

但它不起作用。例如,我的第一个项目刚刚从 A 转到 A vs A vs A vs A vs A

编辑:为了更清楚,我想,

一个列表,例如,

Letters

这将包含四个列表,

ABCD

这些依次包含列表,对应于它们的名称:

答:A vs AA vs BA vs CA vs D B:B vs AB vs BB vs CB vs D C:C vs AC vs BC vs CC vs D D:D vs AD vs BD vs CD vs D

然后我将在每个“vs”中放入一个数据框。

迄今为止最有帮助的答案来自 MrFlick:

lapply(Conditions, function(x) 
  as.list(paste(x, "vs", Conditions)))

返回:

[[1]]
[[1]][[1]]
[1] "A vs A"

[[1]][[2]]
[1] "A vs B"

[[1]][[3]]
[1] "A vs C"

...

[[4]][[2]]
[1] "D vs B"

[[4]][[3]]
[1] "D vs C"

[[4]][[4]]
[1] "D vs D"

我想要的只是列表为空,字符串用作名称。对于上面的元素,我认为它看起来像这样:

[[D]][[D vs D]]
    [1] NA        #Data Frame DvsD.Rda to be added here later.

【问题讨论】:

  • 查看其他答案,我的是唯一一个类似于您绘制的树的答案。这实际上是您想要的(与c("A","A","C","D") 相比)还是每个条件(c("A","B","C","D"))?
  • 应该是A B C D,我弄错了,虽然我以为我已经把它编辑掉了。
  • 好的,我已经相应地编辑了我的答案

标签: arrays r list vector element


【解决方案1】:

这是我的解决方案,看看,

vec <- c("A", "B", "C", "D")

res <- lapply(vec, function(x) {
    out <- expand.grid(x, vec)
    lapply(1:nrow(out), function(y) {
        paste(out[y, 1], " vs ", out[y, 2])
    })
})
str(res)

结果:

List of 4
 $ :List of 4
  ..$ : chr "A  vs  A"
  ..$ : chr "A  vs  B"
  ..$ : chr "A  vs  C"
  ..$ : chr "A  vs  D"
 $ :List of 4
  ..$ : chr "B  vs  A"
  ..$ : chr "B  vs  B"
  ..$ : chr "B  vs  C"
  ..$ : chr "B  vs  D"
 $ :List of 4
  ..$ : chr "C  vs  A"
  ..$ : chr "C  vs  B"
  ..$ : chr "C  vs  C"
  ..$ : chr "C  vs  D"
 $ :List of 4
  ..$ : chr "D  vs  A"
  ..$ : chr "D  vs  B"
  ..$ : chr "D  vs  C"
  ..$ : chr "D  vs  D"

【讨论】:

  • 很抱歉我最初的问题措辞不佳,您能再看一遍吗?
【解决方案2】:

听起来像你想要的

lapply(Conditions, paste, "vs", Conditions)

这是假设向量在列表中是正确的。如果您需要列表,那么您可以这样做

lapply(Conditions, function(x) as.list(paste(x, "vs", Conditions)))

如果您需要给出主列表名称,请使用setNames()

【讨论】:

  • 我最初并不清楚,我正在寻找“vs”组件也是将用数据框填充的列表。
  • 我认为实际上你给了我一些非常接近我想要的东西我只是无法命名我的列表。
  • @SolebaySharp 那么您到底希望最终对象是什么?您可以在问题中包含所需的输出吗?像list(A=list("a v a"=list(), "a v b"=list(), ...) 等。你打算如何在那里获取data.frames?
  • 那个文字描述还是不够准确。您期望的实际结构是什么?对于这个简单的示例,您将如何手动构建它? dput() 会是什么样子?
  • 我不确定如何手动构建它我正在尝试自动化它,因为 A、B、C 和 D 会改变。如果它们是文件夹,则第一个路径将如下所示:Letters/A/AvsA 并最终包含数据框 AvsA.Rda。接下来是 Letters/A/AvsB/AvsB.Rda 等等。然后在以后绘图时,我希望能够按名称调用特定的数据帧,因为我已经对它们进行了命名和组织。
【解决方案3】:

我认为您正在尝试做的事情是这样的:

Conditions <- c('A', 'B', 'C', 'D')

MyList = lapply(Conditions, function(x) list())
names(MyList) = Conditions

for(i in names(MyList)) {
    for(j in 1:length(Conditions)) {
        MyList[[i]][[paste(i, 'vs', Conditions[j])]] = NA #Put NA or the data frame you want.
    }
}

输出:

$A
$A$`A vs A`
[1] NA

$A$`A vs B`
[1] NA

$A$`A vs C`
[1] NA

$A$`A vs D`
[1] NA


$B
$B$`B vs A`
[1] NA

$B$`B vs B`
[1] NA

$B$`B vs C`
[1] NA

$B$`B vs D`
[1] NA


$C
$C$`C vs A`
[1] NA

$C$`C vs B`
[1] NA

$C$`C vs C`
[1] NA

$C$`C vs D`
[1] NA


$D
$D$`D vs A`
[1] NA

$D$`D vs B`
[1] NA

$D$`D vs C`
[1] NA

$D$`D vs D`
[1] NA

【讨论】:

  • 对不起,我最初并不清楚,我正在寻找“vs”组件也是将填充数据框的列表。
  • 如何将已用作字符串的内容作为列表的名称?即不是 $D [[4]] [1] "D vs D" 而是 $D $D vs D [1] NA(数据框稍后放在这里)。
  • 我也改了MyList 的初始化
【解决方案4】:

如果你的逻辑总是一样的,试试

Conditions = c('A', 'B', 'C', 'D')
L=setNames(as.list(Conditions),Conditions)

L=lapply(L, function(x){
  setNames(vector("list",length(Conditions)),paste0(x," vs ",Conditions))
})

> str(L)
List of 4
 $ A:List of 4
  ..$ A vs A: NULL
  ..$ A vs B: NULL
  ..$ A vs C: NULL
  ..$ A vs D: NULL
 $ B:List of 4
  ..$ B vs A: NULL
  ..$ B vs B: NULL
  ..$ B vs C: NULL
  ..$ B vs D: NULL
 $ C:List of 4
  ..$ C vs A: NULL
  ..$ C vs B: NULL
  ..$ C vs C: NULL
  ..$ C vs D: NULL
 $ D:List of 4
  ..$ D vs A: NULL
  ..$ D vs B: NULL
  ..$ D vs C: NULL
  ..$ D vs D: NULL

【讨论】:

  • 有没有一种方法可以让我拥有 $A - A vs A、A vs B、A vs C ... 等等,这样我就可以用数据框替换字符串?
  • 这与我想要的非常接近,但我无法完全匹配。你能再看看我的问题吗?我试图更具体。
  • @SolebaySharp 这应该回答你的问题
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 2021-12-20
  • 2014-06-15
  • 2011-02-07
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多