List R中变量的条件列表选择和追加

List R中变量的条件列表选择和追加,list,r,List,R,假设我有一张这样的清单 i<-c(w=5,n="oes") p<-c(w=9,n="ty",j="ooe") mn<-list(i,p,i,p,i,p,i) i要查找列表中每个元素的长度,请使用length包装在sapply中: len <- sapply(mn, length) len [1] 2 3 2 3 2 3 2 使用子集和as.data.frame创建data.frame。但是这个data.frame将有一些随机的列名,因此我重命名列名: df <-

假设我有一张这样的清单

i<-c(w=5,n="oes")
p<-c(w=9,n="ty",j="ooe")
mn<-list(i,p,i,p,i,p,i)

i要查找列表中每个元素的长度,请使用
length
包装在
sapply
中:

len <- sapply(mn, length)
len
[1] 2 3 2 3 2 3 2
使用子集和
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

df虽然不是很优雅,但它可能会起到以下作用:

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))

然而,更好的做法是使用
NA
,而不是
“未知”

另一种可能性是:

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>
which.min(len)
将比which(len==min(len))更有效。
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>
sapply( all.names, function( v ) if( is.na( r[v] ) ) 'unknown' else r[v], simplify=F )