虽然数据框列必须具有相同的行数,但有没有办法创建长度不等的数据框.我不想将它们保存为列表的单独元素,因为我经常不得不将这些信息作为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)
填充的另一种方法:
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()
只找到最长的一个并将其余部分填充到匹配的长度.
为了扩大@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)
(未经测试)。
您需要的是将 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)
归档时间: |
|
查看次数: |
56062 次 |
最近记录: |