【问题标题】:Convert a vector to data.frame, one column for each unique value将向量转换为 data.frame,每个唯一值对应一列
【发布时间】:2013-12-20 20:36:17
【问题描述】:

我们得到一个向量,如下所示:

x <- c(1,2,1,5,2,1,2,5,1)

我们需要的是一个data.frame,比如y,其行数等于length(x),列数等于length(unique(x)),这意味着x中每个唯一项目一列,这样@987654327 @ 当且仅当xith 元素是xjth 唯一项(分配给列j):

y <- data.frame("1"=x==1, "2"=x==2, "5"=x==5, check.names=F)

执行此操作的简单方法是:

y <- setNames(data.frame(sapply(unique(x), function(i) x==i)), unique(x))

您有更好的想法(即特定功能)吗?

【问题讨论】:

  • 你的方法有什么让你不满意的地方吗?

标签: r vector matrix indexing dataframe


【解决方案1】:

如果您可以使用二进制表示而不是数据的逻辑表示,我会使用table

y <- table(seq_along(x), x)

要获取data.frame,请使用as.data.frame.matrix

as.data.frame.matrix(y)
#   1 2 5
# 1 1 0 0
# 2 0 1 0
# 3 1 0 0
# 4 0 0 1
# 5 0 1 0
# 6 1 0 0
# 7 0 1 0
# 8 0 0 1
# 9 1 0 0

【讨论】:

    【解决方案2】:

    outer怎么样?

    outer( x , unique(x) , `==` )
    #      [,1]  [,2]  [,3]
    # [1,]  TRUE FALSE FALSE
    # [2,] FALSE  TRUE FALSE
    # [3,]  TRUE FALSE FALSE
    # [4,] FALSE FALSE  TRUE
    # [5,] FALSE  TRUE FALSE
    # [6,]  TRUE FALSE FALSE
    # [7,] FALSE  TRUE FALSE
    # [8,] FALSE FALSE  TRUE
    # [9,]  TRUE FALSE FALSE
    

    显然完成它会像这样包裹它......

    setNames( data.frame( outer( x , unique(x) , `==` ) ) , unique( x ) )
    

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多