在R中取消堆叠数据帧,每个类别只有一行

时间:2014-05-14 23:27:45

标签: r dataframe

如果我在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

无论每个类别中有多少行,我都需要将这些动物类别作为列标题。有人有什么想法吗?

3 个答案:

答案 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.framesplit会这样做:

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