创建不等长的数据帧

ATM*_*hew 20 r dataframe

虽然数据框列必须具有相同的行数,但有没有办法创建长度不等的数据框.我不想将它们保存为列表的单独元素,因为我经常不得不将这些信息作为csv文件发送给人们,这是最简单的数据框架.

x = c(rep("one",2))
y = c(rep("two",10))
z = c(rep("three",5))
cbind(x,y,z)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,cbind()函数只是回收较短的列,以便它们在每列中都有10个元素.我怎么能改变它只是为了长度为2,10和5.

我过去通过执行以下操作完成了此操作,但效率很低.

  df = data.frame(one=c(rep("one",2),rep("",8)), 
           two=c(rep("two",10)), three=c(rep("three",5), rep("",5))) 
Run Code Online (Sandbox Code Playgroud)

Owe*_*wen 26

对不起,这不是你问的问题,但我认为可能有另一种方法可以得到你想要的东西.

首先,如果向量是不同的长度,数据不是真正的表格,是吗?如何将其保存到不同的CSV文件?您也可以尝试使用ascii格式来存储多个对象(json,XML).

如果您觉得数据确实是表格式的,那么您可以填写NAs:

> x = 1:5
> y = 1:12
> max.len = max(length(x), length(y))
> x = c(x, rep(NA, max.len - length(x)))
> y = c(y, rep(NA, max.len - length(y)))
> x
 [1]  1  2  3  4  5 NA NA NA NA NA NA NA
> y
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
Run Code Online (Sandbox Code Playgroud)

如果你绝对必须data.frame使用不相等的列,你可能会破坏支票,这是你自己的危险:

> x = 1:5
> y = 1:12
> df = list(x=x, y=y)
> attributes(df) = list(names = names(df),
    row.names=1:max(length(x), length(y)), class='data.frame')
> df
      x  y
1     1  1
2     2  2
3     3  3
4     4  4
5     5  5
6  <NA>  6
7  <NA>  7
 [ reached getOption("max.print") -- omitted 5 rows ]]
Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  corrupt data frame: columns will be truncated or padded with NAs
Run Code Online (Sandbox Code Playgroud)

  • 通过 RStudio 1.0.136 使用 r.3.3.3 时,“颠覆检查”选项不起作用。它使 R 崩溃。 (2认同)

Pet*_*r M 6

填充的另一种方法:

na.pad <- function(x,len){
    x[1:len]
}

makePaddedDataFrame <- function(l,...){
    maxlen <- max(sapply(l,length))
    data.frame(lapply(l,na.pad,len=maxlen),...)
}

x = c(rep("one",2))
y = c(rep("two",10))
z = c(rep("three",5))

makePaddedDataFrame(list(x=x,y=y,z=z))
Run Code Online (Sandbox Code Playgroud)

na.pad()函数利用了这样一个事实:如果你试图索引不存在的元素,R将自动用NA填充向量.

makePaddedDataFrame() 只找到最长的一个并将其余部分填充到匹配的长度.


Ben*_*ker 5

为了扩大@goodside的答案,您可以做类似的事情

L <- list(x,y,z)
cfun <- function(L) {
  pad.na <- function(x,len) {
   c(x,rep(NA,len-length(x)))
  }
  maxlen <- max(sapply(L,length))
  do.call(data.frame,lapply(L,pad.na,len=maxlen))
}
Run Code Online (Sandbox Code Playgroud)

(未经测试)。


Maë*_*aël 5

您需要的是将 NA 填充到向量的末尾以匹配最长向量的长度,因此您可以执行以下操作:

l <- tibble::lst(x, y, z)
data.frame(lapply(l, `length<-`, max(lengths(l))))

      x   y     z
1   one two three
2   one two three
3  <NA> two three
4  <NA> two three
5  <NA> two three
6  <NA> two  <NA>
7  <NA> two  <NA>
8  <NA> two  <NA>
9  <NA> two  <NA>
10 <NA> two  <NA>
Run Code Online (Sandbox Code Playgroud)