Мне вообще не ясно, что на самом деле делает ОП, учитывая последующие комментарии. Возможно, они действительно ищут способ записать данные в файл.
Но давайте предположим, что мы действительно ищем способ cbind
нескольких фреймов данных разной длины.
cbind
в конце концов позвонит data.frame
, чьи файлы справки говорят:
Объекты, передаваемые в data.frame, должны иметь одинаковое количество строк, но атомарные векторы, факторы и векторы символов, защищенные I, при необходимости будут переработаны целое число раз (включая, начиная с R 2.9.0, элементы аргументов списка).
поэтому в реальном примере OP не должно быть ошибки, так как R должен повторно использовать более короткие векторы, чтобы они имели длину 50. Действительно, когда я запускаю следующее:
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)
Я не получаю ошибок, и более короткий кадр данных перерабатывается, как и ожидалось. Однако, когда я запускаю это:
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 заключается в том, что вы можете заставить его делать почти все, что захотите, даже если вы не должны этого делать. Например, вот простая функция, которая будет cbind
фреймов данных разной длины и автоматически заполнит более короткие NA
s:
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)
Я не даю гарантий, что эта функция работает во всех случаях; это предназначено только в качестве примера.
ИЗМЕНИТЬ
Если основной целью является создание файла csv или текстового файла, все, что вам нужно сделать, это изменить функцию на заполнение, используя ""
, а не NA
, а затем сделать что-то вроде этого:
dat <- cbindPad(dat1,dat2,dat3)
rs <- as.data.frame(apply(dat,1,function(x){paste(as.character(x),collapse=",")}))
а затем используйте write.table
на rs
.
person
joran
schedule
09.08.2011
merge()
. Просьба уточнить. - person Iterator   schedule 09.08.2011merge
по имени строки - это то, что вам нужно здесь. - person Chase   schedule 09.08.2011