如何在列表中创建一个列表,使用来自一个向量的元素,在 r
How to create a list inside a list, using elements from one vector, in r
我正在尝试使用 R 中的单个向量在列表中创建列表。
我有向量
Conditions = c('A', 'B', 'C', 'D')
我想要一个包含 A、B、C 和 D 的列表(没问题)。但是我也希望这些列表包含四个项目,这些项目的名称如下:A vs A
、A vs B
、...D vs C
、D 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
这将包含四个列表,
A
, B
, C
, D
这些又将包含与其名称相对应的列表:
答:A vs A
、A vs B
、A vs C
、A vs D
B: B vs A
, B vs B
, B vs C
, B vs D
C: C vs A
, C vs B
, C vs C
, C vs D
D: D vs A
, D vs B
, D vs C
, D vs D
然后我将把一个数据框放入每个 'vs'。
迄今为止最有帮助的回答来自 MrFlick:
lapply(Conditions, function(x)
as.list(paste(x, "vs", Conditions)))
哪个returns:
[[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.
这是我的解决方案,你看看,
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"
听起来你想要
lapply(Conditions, paste, "vs", Conditions)
这是假设向量在列表中是正确的。如果你需要列表,那么你可以做
lapply(Conditions, function(x) as.list(paste(x, "vs", Conditions)))
如果需要给主要列表名称,请使用setNames()
我想你想做的是这样的:
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
如果你的逻辑总是一样,试试
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
我正在尝试使用 R 中的单个向量在列表中创建列表。
我有向量
Conditions = c('A', 'B', 'C', 'D')
我想要一个包含 A、B、C 和 D 的列表(没问题)。但是我也希望这些列表包含四个项目,这些项目的名称如下:A vs A
、A vs B
、...D vs C
、D 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
这将包含四个列表,
A
, B
, C
, D
这些又将包含与其名称相对应的列表:
答:A vs A
、A vs B
、A vs C
、A vs D
B: B vs A
, B vs B
, B vs C
, B vs D
C: C vs A
, C vs B
, C vs C
, C vs D
D: D vs A
, D vs B
, D vs C
, D vs D
然后我将把一个数据框放入每个 'vs'。
迄今为止最有帮助的回答来自 MrFlick:
lapply(Conditions, function(x)
as.list(paste(x, "vs", Conditions)))
哪个returns:
[[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.
这是我的解决方案,你看看,
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"
听起来你想要
lapply(Conditions, paste, "vs", Conditions)
这是假设向量在列表中是正确的。如果你需要列表,那么你可以做
lapply(Conditions, function(x) as.list(paste(x, "vs", Conditions)))
如果需要给主要列表名称,请使用setNames()
我想你想做的是这样的:
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
如果你的逻辑总是一样,试试
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