【问题标题】:Vector to dataframe with variable row length [duplicate]具有可变行长的向量到数据帧[重复]
【发布时间】:2018-03-26 23:35:23
【问题描述】:

给定一个向量,我想使用一个“键”值将其转换为数据帧,该值在将要成为行的开始处随机分布在整个向量中。在这种情况下,“z”将是每列中的第一个值。

vd <- c("z","a","b","c","z","a","b","c","z","a","b","c","d")

结果数据应如下所示:

#using magrittr
data.frame(x1 = c("z","a","b","c", NA), x2 = c("z","a","b","c", NA), x3 = c("z","a","b","c","d")) 
%>% transpose()

一种解决方案是找到向量中“键”之间的最大距离,然后在“部分”末尾插入小于最长“部分”的空白值,以便您可以使用matrix()

最好的方法是什么?

【问题讨论】:

  • key 是什么意思?
  • 欢迎来到 SO。在您的问题标题中,您要求“向量到矩阵”,但随后您说您想将“它转换为数据框”......此外,您的代码会产生一个非常不可读的数据框。作为一个建议,我会命名我的列并使用 NA 而不是 ""
  • @smanski 我猜 OP 在他的例子中意味着“z”。这就是向量的划分方式。这是正确的,OP?您的问题在这里有些不清楚,是对我们逻辑的测试
  • @WC RN NR-DA(有趣的名字):您确定要在您的 data.frame 上使用 transpose 吗?这将返回一个列表
  • read.table(text=gsub ("z","\n",paste(vd,collapse=" ")),fill=T)

标签: r


【解决方案1】:
plyr::ldply(split(vd, cumsum(vd == "z")), rbind)[-1]

(复制自here

结果:

  1 2 3 4    5
1 z a b c <NA>
2 z a b c <NA>
3 z a b c    d

【讨论】:

  • 很高兴发现这个问题
  • 你应该添加库调用
  • 看到这个我真的很惊讶——今天早些时候有人问了另一个问题,起初我以为是同一个人问了他们的问题两次......
【解决方案2】:

我们可以使用cumsum 来识别组然后拆分它们。然后我们附加向量并将它们格式化为data.frame

x <- split(vd,cumsum("z"==vd))
maxl <- max(lengths(x))
as.data.frame(lapply(x,function(y) c(y,rep(NA,maxl-length(y)))))
#     X1   X2 X3
# 1    z    z  z
# 2    a    a  a
# 3    b    b  b
# 4    c    c  c
# 5 <NA> <NA>  d

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 2011-07-17
    • 2021-09-19
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多