说我有一个像这样的列表
i<-c(w=5,n="oes")
p<-c(w=9,n="ty",j="ooe")
mn<-list(i,p,i,p,i,p,i)
现在我想选择具有最短长度(i)的列表元素,并在创建数据帧之前将“unknown”附加到列表中。我怎么能这样做?
编辑:最后,我希望列表中mn中的每个i元素为w = 5,n =“oes”,j =“unknown”,之后mn将p更改为数据帧:
答案 0 :(得分:2)
要查找列表中每个元素的长度,请使用length
中包含的sapply
:
len <- sapply(mn, length)
len
[1] 2 3 2 3 2 3 2
现在,仅识别那些长度等于最短长度的元素:
which(len==min(len))
[1] 1 3 5 7
使用子集和as.data.frame
来创建data.frame。但是这个data.frame会有一些随机的列名,所以我重命名列名:
df <- as.data.frame(mn[which(len==min(len))])
names(df) <- seq_len(ncol(df))
df
1 2 3 4
w 5 5 5 5
n oes oes oes oes
你必须澄清你对这个data.frame“追加未知”的含义。
答案 1 :(得分:0)
不是很优雅,但可能会有这个诀窍:
maxlength <- max(sapply(mn,length))
## make a new list, with the "missing" entries replaced with "unknown"
mn2 <- lapply(mn,function(x)c(x,rep('unknown',maxlength - length(x))))
## convert to a data.frame
mn3 <- data.frame(matrix(unlist(mn2),nrow = 3))
以下是
> mn3
X1 X2 X3 X4 X5 X6 X7
1 5 9 5 9 5 9 5
2 oes ty oes ty oes ty oes
3 unknown ooe unknown ooe unknown ooe unknown
但最好使用NA
,而不是"unknown"
答案 2 :(得分:0)
另一种可能性是:
all.names = unique( unlist( lapply( mn, names ) ) )
do.call( 'rbind', lapply( mn, function( r ) {
data.frame( sapply( all.names, function( v ) r[ v ], simplify=F ) )
} ) )
给出:
w n j
w 5 oes <NA>
w1 9 ty ooe
w2 5 oes <NA>
w3 9 ty ooe
w4 5 oes <NA>
w5 9 ty ooe
w6 5 oes <NA>
但是我觉得这个解决方案有一条更简洁的路线......
修改强>
如果您想要unknown
而非<NA>
,则可以将内部sapply
更改为:
sapply( all.names, function( v ) if( is.na( r[v] ) ) 'unknown' else r[v], simplify=F )