49

rbind.fillの(Hadley のplyrパッケージで)の類似物を探していると思いますcbind。見ましたが、ありませんcbind.fill

私がやりたいことは次のとおりです。

#set these just for this example
one_option <- TRUE
diff_option <- TRUE

return_df <- data.frame()

if (one_option) {
    #do a bunch of calculations, produce a data.frame, for simplicity the following small_df
    small_df <- data.frame(a=1, b=2)
    return_df <- cbind(return_df,small_df)
}

if (diff_option) {
    #do a bunch of calculations, produce a data.frame, for simplicity the following small2_df
    small2_df <- data.frame(l="hi there", m=44)
    return_df <- cbind(return_df,small2_df)
}

return_df

当然のことながら、これによりエラーが発生します。

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 0, 1

return_df <- data.frame()私の現在の修正は、行を次のように置き換えることreturn_df <- data.frame(dummy=1)です。これにより、コードが機能します。最後にダミーを削除しreturn_dfます。ダミーを追加して上記のコードを実行すると、

      dummy a b        l  m
1     1 1 2 hi there 44

次に、ダミーを取り除く必要があります。たとえば、次のようになります。

> return_df[,2:ncol(return_df)]
  a b        l  m
1 1 2 hi there 44

これを行う簡単な方法が欠けていると確信しています。

編集: cbind.fill を探していないと思います。これは、cbind の後に NA 値が作成されることを意味するためです。これは、私が望むものではありません。

4

10 に答える 10

59

これはcbindの塗りつぶしです:

cbind.fill <- function(...){
    nm <- list(...) 
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
        rbind(x, matrix(, n-nrow(x), ncol(x))))) 
}

試してみよう:

x<-matrix(1:10,5,2)
y<-matrix(1:16, 4,4)
z<-matrix(1:12, 2,6)

cbind.fill(x,y)
cbind.fill(x,y,z)
cbind.fill(mtcars, mtcars[1:10,])

これをどこかから盗んだのだと思います。

ここからストールを編集:リンク

于 2011-11-01T03:51:31.773 に答える
13

タイラーの解決策は直接的であり、ここで最高のものだと思いますが、私は、私rbind.fill()たちがすでに持っているものを使用して、別の方法を提供します.

require(plyr) # requires plyr for rbind.fill()
cbind.fill <- function(...) {                                                                                                                                                       
  transpoted <- lapply(list(...),t)                                                                                                                                                 
  transpoted_dataframe <- lapply(transpoted, as.data.frame)                                                                                                                         
  return (data.frame(t(rbind.fill(transpoted_dataframe))))                                                                                                                          
} 
于 2011-11-01T05:59:28.263 に答える
5

使用するrowr::cbind.fill

rowr::cbind.fill(df1,df2,fill = NA)
   A B
1  1 1
2  2 2
3  3 3
4  4 4
5  5 5
6 NA 6
于 2018-07-27T19:39:01.393 に答える
1

qpcR パッケージの cbind.na はそれを行うことができます。

    install.packages("qpcR")
    library(qpcR)
    qpcR:::cbind.na(1, 1:7)
于 2013-08-08T08:09:13.887 に答える
0

タイラーの答えを修正することをお勧めします。私の関数cbindでは、タイラーのソリューションで発生するように列名を失うことなく、ベクトルを使用して data.frames および/または行列を -ingできます

cbind.fill <- function(...){
  nm <- list(...) 
  dfdetect <- grepl("data.frame|matrix", unlist(lapply(nm, function(cl) paste(class(cl), collapse = " ") )))
  # first cbind vectors together 
  vec <- data.frame(nm[!dfdetect])
  n <- max(sapply(nm[dfdetect], nrow)) 
  vec <- data.frame(lapply(vec, function(x) rep(x, n)))
  if (nrow(vec) > 0) nm <- c(nm[dfdetect], list(vec))
  nm <- lapply(nm, as.data.frame)

  do.call(cbind, lapply(nm, function (df1) 
    rbind(df1, as.data.frame(matrix(NA, ncol = ncol(df1), nrow = n-nrow(df1), dimnames = list(NULL, names(df1))))) )) 
}

cbind.fill(data.frame(idx = numeric()), matrix(0, ncol = 2), 
           data.frame(qwe = 1:3, rty = letters[1:3]), type = "GOOD", mark = "K-5")
#       idx V1 V2 qwe rty type mark
#     1  NA  0  0   1   a GOOD  K-5
#     2  NA NA NA   2   b GOOD  K-5
#     3  NA NA NA   3   c GOOD  K-5
于 2015-07-28T13:42:35.917 に答える
0

空のデータフレームに列を追加したいときは、後でcbindするのではなく、最初にrbindするというトリックを見つけました。

    newdf <- data.frame()
    # add the first column
    newdf <- rbind(newdf,data.frame("col1"=c("row1"=1,"row2"=2)))
    # add the second column
    newdf <- cbind(newdf,data.frame("col2"=c("row1"=3,"row2"=4)))
    # add more columns
    newdf <- cbind(newdf,data.frame("col3"=c("row1"=5,"row2"=6)))
    # result
    #     col1 col2 col3
    #row1    1    3    5
    #row2    2    4    6

理由はわかりませんが、私にとってはうまくいきます。

于 2017-02-22T16:41:57.383 に答える