2016-11-06 12 views
1

この投稿How do I remove empty data frames from a list?は、空のデータフレームを削除する方法について話します。空のデータフレーム(nrow = 0)をリストから削除し、1行のプレースホルダdataframes/data.tablesに置き換えるにはどうすればよいですか?リストから空のdataframe/data.tablesをプレースホルダdata.tableに置き換えるにはどうすればよいですか?

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2)) 
M2 <- data.frame(matrix(nrow = 0, ncol = 0)) 
M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2)) 
mlist <- list(M1, M2, M3) 

placeholder = data.table(a=1,b=1) 

私が試した:これについて

lapply(mlist, function(x) ifelse(nrow(fundslist[[x]]) == 0, placeholder, x)) 

答えて

5

一つのオプションlengths

mlist[!lengths(mlist)] <- list(placeholder) 
str(mlist) 
#List of 3 
# $ :'data.frame':  2 obs. of 2 variables: 
# ..$ X1: int [1:2] 1 2 
# ..$ X2: int [1:2] 3 4 
# $ :Classes ‘data.table’ and 'data.frame':  1 obs. of 2 variables: 
# ..$ a: num 1 
# ..$ b: num 1 
# ..- attr(*, ".internal.selfref")=<externalptr> 
# $ :'data.frame':  2 obs. of 2 variables: 
# ..$ X1: int [1:2] 9 10 
# ..$ X2: int [1:2] 11 12 
+1

ああ、「長さ」、何とかそれを逃した。これは、リストのリサイクルを使用する限り、明らかに優れた解決策です。 –

+2

うまくやった!!!! – Sotos

+2

マイナーポイント:私はしばしば、観測値を持たない(OPのように0ではない) "DT = data.table(a = 1)[0L]のような列を持っている"空の " ] '。その場合、 '!sapply(mlist、nrow)'のテスト。 – Frank

3

どのように?あなたのプレースホルダはかなり小さいので、n倍にするのは問題ではありません。

library(data.table) 

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2)) 
M2 <- data.frame(matrix(nrow = 0, ncol = 0)) 
M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2)) 
mlist <- list(M1, M2, M3) 

placeholder = data.table(a=1,b=1) 

num.rows <- unlist(lapply(mlist, nrow)) 
num.zeros <- length(num.rows[num.rows == 0]) 
replacement <- replicate(num.zeros, {placeholder}, simplify = FALSE) 

mlist[num.rows == 0] <- replacement 

str(mlist) 

List of 3 
$ :'data.frame': 2 obs. of 2 variables: 
    ..$ X1: int [1:2] 1 2 
    ..$ X2: int [1:2] 3 4 
$ :Classes ‘data.table’ and 'data.frame': 1 obs. of 2 variables: 
    ..$ a: num 1 
    ..$ b: num 1 
    ..- attr(*, ".internal.selfref")=<externalptr> 
$ :'data.frame': 2 obs. of 2 variables: 
    ..$ X1: int [1:2] 9 10 
    ..$ X2: int [1:2] 11 12 
+0

は、あなたの答えをありがとう使用することでしょう! – gibbz00

1

アプローチ自体を使ってどのように完了することができるか説明してください。

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2)) 
M2 <- data.frame(matrix(nrow = 0, ncol = 0)) 
M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2)) 
mlist <- list(M1, M2, M3) 

placeholder = data.frame(matrix(c(1,1), nrow=1)) 

abc <- function(x){ 
    if(sum(dim(x))==0) 
    return(data.frame(placeholder)) 
    else 
    return(x) 
} 

lapply(mlist, abc) 
+0

ありがとうございました! – gibbz00

関連する問題