1

想象一下,我有以下堆叠数据矩阵:

mY <- data.frame(matrix(c(c(1:10),c("A 1","A 1","A 1","A 1","A 1","B 1","B 1","B 1","B 1","B 1")),10))

导致:

   X1 X2
1   1 A 1
2   2 A 1
3   3 A 1
4   4 A 1
5   5 A 1
6   6 B 1
7   7 B 1
8   8 B 1
9   9 B 1
10 10 B 1

这只是我想要取消堆叠的数据框的一个示例,其中 X2 中的条目包含空格字符。它也可能是“热狗”或“煮鸡蛋”。

当我使用

mB <- unstack(mY, X1~X2)

我明白了

  A.1 B.1
1   1   6
2   2   7
3   3   8
4   4   9
5   5  10

请注意,列的名称已更改为 A.1 和 B.1,之前定义为“A 1”和“B 1”。当我使用 mB["A 1"] 时,它返回 null,而 mB["A.1"] 返回 A.1 列。我该如何克服呢?

提前致谢。

4

2 回答 2

1

使用带有空格的列名是一个坏主意,但如果你想继续使用它们,这里有一个简单的解决方法。它用于setNames()将列重命名为存储在unique(mY$X2).

setNames(unstack(mY, X1~X2), unique(mY$X2))
#   A 1 B 1
# 1   1   6
# 2   2   7
# 3   3   8
# 4   4   9
# 5   5  10
于 2013-09-15T12:11:47.077 回答
0

出于好奇,我检查了这个:Unstacking withdcast保留“语法上无效的名称”。

library(reshape2)

# need to create an id variable that is used as 'row variable', LHS in the casting formula
mY$id <- ave(mY$X2, mY$X2, FUN = seq_along)

dcast(data = mY, id ~ X2, value.var = "X1")

#   id A 1 B 1
# 1  1   1   6
# 2  2   2   7
# 3  3   3   8
# 4  4   4   9
# 5  5   5  10

@Josh O'Brien 的解决方案虽然干净得多。

于 2013-09-15T12:29:36.997 回答