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

时间:2011-07-06 09:10:41

标签: 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)的列表元素,并在创建数据帧之前将“unknown”附加到列表中。我怎么能这样做?

编辑:最后,我希望列表中mn中的每个i元素为w = 5,n =“oes”,j =“unknown”,之后mn将p更改为数据帧:

3 个答案:

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