第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并兩個不同長度的數(shù)據(jù)幀

合并兩個不同長度的數(shù)據(jù)幀

千巷貓影 2019-11-18 14:23:49
我有兩個數(shù)據(jù)框。第一個只有一列十行。第二個是3列50行。當(dāng)我嘗試通過使用進(jìn)行組合時cbind,出現(xiàn)以下錯誤:data.frame(...,check.names = FALSE)錯誤:誰能建議另一個功能來做到這一點?PS我也嘗試過使用列表,但這給出了同樣的錯誤。當(dāng)我使用該write.table函數(shù)編寫代碼時,由3列組成的數(shù)據(jù)框應(yīng)為CSV文件中的前3列,而具有一列的數(shù)據(jù)框應(yīng)為該文件中的第四列。前三列有50行,第四列應(yīng)占前10行。
查看完整描述

3 回答

?
MM們

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊

在plyr包中,有一個函數(shù)rbind.fill將合并data.frames并NA為空單元格引入:


library(plyr)

combined <- rbind.fill(mtcars[c("mpg", "wt")], mtcars[c("wt", "cyl")])

combined[25:40, ]


    mpg    wt cyl

25 19.2 3.845  NA

26 27.3 1.935  NA

27 26.0 2.140  NA

28 30.4 1.513  NA

29 15.8 3.170  NA

30 19.7 2.770  NA

31 15.0 3.570  NA

32 21.4 2.780  NA

33   NA 2.620   6

34   NA 2.875   6

35   NA 2.320   4


查看完整回答
反對 回復(fù) 2019-11-18
?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗 獲得超7個贊

鑒于后續(xù)評論,我尚不清楚OP實際執(zhí)行的操作。他們實際上可能正在尋找一種將數(shù)據(jù)寫入文件的方法。


但是,讓我們假設(shè)我們確實是在尋找cbind一種不同長度的多個數(shù)據(jù)幀的方法。


cbind最終會致電data.frame,其幫助文件中顯示:


傳遞給data.frame的對象應(yīng)該具有相同的行數(shù),但是,如果有必要,我保護(hù)的原子向量,因子和字符向量將被回收多次(包括從R 2.9.0版開始,包括列表參數(shù)的元素)。


因此在OP的實際示例中,應(yīng)該不會有錯誤,因為R應(yīng)該將較短的向量回收為長度為50的。確實,當(dāng)我運行以下命令時:


set.seed(1)

a <- runif(50)

b <- 1:50

c <- rep(LETTERS[1:5],length.out = 50)

dat1 <- data.frame(a,b,c)

dat2 <- data.frame(d = runif(10),e = runif(10))

cbind(dat1,dat2)

我沒有任何錯誤,較短的數(shù)據(jù)幀也按預(yù)期回收。但是,當(dāng)我運行此命令時:


set.seed(1)

a <- runif(50)

b <- 1:50

c <- rep(LETTERS[1:5],length.out = 50)

dat1 <- data.frame(a,b,c)

dat2 <- data.frame(d = runif(9), e = runif(9))

cbind(dat1,dat2)

我收到以下錯誤:


Error in data.frame(..., check.names = FALSE) : 

  arguments imply differing number of rows: 50, 9

但是R的奇妙之處在于,即使您不希望這樣做,也可以使它幾乎可以做任何您想做的事情。例如,這是一個簡單的函數(shù),它將cbind對長度不均勻的數(shù)據(jù)幀進(jìn)行數(shù)據(jù)處理,并使用NAs 自動填充較短的幀:


cbindPad <- function(...){

args <- list(...)

n <- sapply(args,nrow)

mx <- max(n)

pad <- function(x, mx){

    if (nrow(x) < mx){

        nms <- colnames(x)

        padTemp <- matrix(NA, mx - nrow(x), ncol(x))

        colnames(padTemp) <- nms

        if (ncol(x)==0) {

          return(padTemp)

        } else {

        return(rbind(x,padTemp))

          }

    }

    else{

        return(x)

    }

}

rs <- lapply(args,pad,mx)

return(do.call(cbind,rs))

}

可以這樣使用:


set.seed(1)

a <- runif(50)

b <- 1:50

c <- rep(LETTERS[1:5],length.out = 50)

dat1 <- data.frame(a,b,c)

dat2 <- data.frame(d = runif(10),e = runif(10))

dat3 <- data.frame(d = runif(9), e = runif(9))

cbindPad(dat1,dat2,dat3)

我不能保證此功能在所有情況下都有效。它僅作為示例。


編輯


如果主要目標(biāo)是創(chuàng)建一個csv或文本文件,那么您要做的所有事情都會將功能更改為pad ""而不是NA,然后執(zhí)行以下操作:


dat <- cbindPad(dat1,dat2,dat3)

rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))

然后write.table在上使用rs。


查看完整回答
反對 回復(fù) 2019-11-18
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊

我的想法是獲取所有data.frames的最大行數(shù),然后根據(jù)需要將空矩陣追加到每個data.frame。此方法不需要其他程序包,僅使用base。代碼如下:


list.df <- list(data.frame(a = 1:10), data.frame(a = 1:5), data.frame(a = 1:3))


max.rows <- max(unlist(lapply(list.df, nrow), use.names = F))


list.df <- lapply(list.df, function(x) {

    na.count <- max.rows - nrow(x)

    if (na.count > 0L) {

        na.dm <- matrix(NA, na.count, ncol(x))

        colnames(na.dm) <- colnames(x)

        rbind(x, na.dm)

    } else {

        x

    }

})


do.call(cbind, list.df)


#     a  a  a

# 1   1  1  1

# 2   2  2  2

# 3   3  3  3

# 4   4  4 NA

# 5   5  5 NA

# 6   6 NA NA

# 7   7 NA NA

# 8   8 NA NA

# 9   9 NA NA

# 10 10 NA NA


查看完整回答
反對 回復(fù) 2019-11-18
  • 3 回答
  • 0 關(guān)注
  • 899 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號