如果我在R中有以下名为pets
的数据框:
> pets
name animal
1 Amy dog
2 Bob cat
3 Carol dog
4 Danny cat
5 Eustace horse
6 Frances horse
我可以unstack
数据框将动物类别设置为列标题,如下所示:
> unstack(pets, pets$name ~ pets$animal)
cat dog horse
1 Bob Amy Eustace
2 Danny Carol Frances
但是,如果pets
数据框只有每个动物的一个实例:
> pets
name animal
1 Amy dog
2 Bob cat
然后运行相同的代码产生这个结果:
> unstack(pets, pets$name ~ pets$animal)
res
cat Bob
dog Amy
无论每个类别中有多少行,我都需要将这些动物类别作为列标题。有人有什么想法吗?
答案 0 :(得分:2)
您可以简单地转置结果:
> t(unstack(pets))
cat dog
res "Bob" "Amy"
如果您想要一个适合两者的解决方案:
unstack <- function(..., drop=FALSE) {
u <- utils::unstack(...)
if (!drop && ncol(u) == 1) {
u <- t(u)
rownames(u) <- 1
return(u)
} else {
return(u)
}
}
这将覆盖unstack
功能。 drop=TRUE
保留默认行为,而drop=FALSE
则为您提供所需的输出。
答案 1 :(得分:2)
data.frame
和split
会这样做:
pets <- data.frame(
name=c("Amy", "Bob", "Carol", "Danny", "Eustace", "Frances"),
animal=c("dog", "cat", "dog", "cat", "horse", "horse")
)
data.frame(split(pets$name,pets$animal,drop=TRUE))
# cat dog horse
#1 Bob Amy Eustace
#2 Danny Carol Frances
pets2 <- pets[1:2,]
data.frame(split(pets2$name,pets2$animal,drop=TRUE))
# cat dog
#1 Bob Amy
答案 2 :(得分:0)
另一种选择:
> p2 <- pets[!duplicated(pets$animal), ]
> data.frame(matrix(p2$name, nrow = 1, ncol = nrow(p2),
dimnames = list(NULL, p2$animal)))
# dog cat horse
# 1 Amy Bob Eustace