【发布时间】:2022-01-17 01:32:54
【问题描述】:
假设我有一个数据框df
> dput(df)
structure(list(x = c("X", "X", "X", "Y", "Y", "Z", "Z", "Z"),
y = c("A", "B", "C", "B", "C", "A", "C", "D")), class = "data.frame", row.names = c(NA,
-8L))
> df
x y
1 X A
2 X B
3 X C
4 Y B
5 Y C
6 Z A
7 Z C
8 Z D
并生成一个列表u1,如下所示
u1 <- with(
df,
tapply(y, x, combn, 2, toString)
)
在哪里
> u1
$X
[1] "A, B" "A, C" "B, C"
$Y
[1] "B, C"
$Z
[1] "A, C" "A, D" "C, D"
> str(u1)
List of 3
$ X: chr [1:3(1d)] "A, B" "A, C" "B, C"
$ Y: chr [1(1d)] "B, C"
$ Z: chr [1:3(1d)] "A, C" "A, D" "C, D"
- attr(*, "dim")= int 3
- attr(*, "dimnames")=List of 1
..$ : chr [1:3] "X" "Y" "Z"
当我运行stack(u1)时,我会出现以下错误
> stack(u1)
Error in stack.default(u1) : at least one vector element is required
似乎我不能直接在tapply 的输出上使用stack,即使它是一个命名列表。
但是,当我使用 u2 <- Map(c,u1) 进行后处理时,事情又会恢复正常
> u2 <- Map(c, u1)
> u2
$X
[1] "A, B" "A, C" "B, C"
$Y
[1] "B, C"
$Z
[1] "A, C" "A, D" "C, D"
> str(u2)
List of 3
$ X: chr [1:3] "A, B" "A, C" "B, C"
$ Y: chr "B, C"
$ Z: chr [1:3] "A, C" "A, D" "C, D"
> stack(u2)
values ind
1 A, B X
2 A, C X
3 B, C X
4 B, C Y
5 A, C Z
6 A, D Z
7 C, D Z
如我们所见,在str(u2) 中,属性被过滤掉了,这似乎解决了问题。
我的问题是:
为什么u1 失败但u2 成功?有没有其他方法可以在不进行任何后处理的情况下使用tapply 而不是u1(如Map(c, u1))?
【问题讨论】: