2014-12-20 2 views
3

У меня есть векторы разной длины. Например:вектор в dataframe в r заданной длины вектора

df1 
[1] 1 95 5 2 135 4 3 135 4 4 135 4 5 135 4 6 135 4 

df2 
[1] 1 70 3 2 110 4 3 112 4 

Я пытаюсь написать скрипт в R для того, чтобы иметь любой вектор ввести функцию или цикл, и он возвращает dataframe из трех колонок. Таким образом, отдельный блок данных для каждого входного вектора. Каждый вектор кратен трем (следовательно, три столбца). Я довольно новичок в R в плане написания функций и, похоже, не понимаю этого. Вот моя попытка:

newdf = c() 
ld <- length(df1) 
ld_mult <- length(df1)/3 
ld_seq <- seq(from=1,to=ld,by=3) 
ld_seq2 < ld_seq +2 
for (i in 1:ld_mult) { 
    newdf[i,] <- df1[ld_seq[i]:ld_seq2[i]] 
} 

выход я хочу для df1 бы:

1 95 5 
2 135 4 
3 135 4 
4 135 4 
5 135 4 
6 135 4 

ответ

5

Вот пример того, как можно использовать matrix для этой цели:

x <- c(1, 95, 5,2, 135, 4, 3, 135, 4) 

as.data.frame(matrix(x, ncol = 3, byrow = TRUE)) 
# V1 V2 V3 
#1 1 95 5 
#2 2 135 4 
#3 3 135 4 

И

y <- c(1, 70, 3, 2, 110, 4, 3, 112, 4) 
as.data.frame(matrix(y, ncol = 3, byrow = TRUE)) 
# V1 V2 V3 
#1 1 70 3 
#2 2 110 4 
#3 3 112 4 

Или, если вы хотите, чтобы сделать его пользовательскую функцию:

newdf <- function(vec) { 
    as.data.frame(matrix(vec, ncol = 3, byrow = TRUE)) 
} 

newdf(y) 
#V1 V2 V3 
#1 1 70 3 
#2 2 110 4 
#3 3 112 4 

Вы могли бы также позволить пользователю указать количество столбцов он хочет создать с помощью функции, если добавить еще один аргумент newdf:

newdf <- function(vec, cols = 3) { 
    as.data.frame(matrix(vec, ncol = cols, byrow = T)) 
} 

Теперь число столбцов по умолчанию равно 3, если пользователь не указывает число. Если он хочет, он мог бы использовать его как это:

newdf(z, 5) # to create 5 columns 

Другой хороший маленький аддон для функции будет проверка, если длина входного вектора кратно числу столбцов, указанных в вызове функции:

newdf <- function(vec, cols = 3) { 
    if(length(vec) %% cols != 0) { 
    stop("Number of columns is not a multiple of input vector length. Please double check.") 
    } 
    as.data.frame(matrix(vec, ncol = cols, byrow = T)) 
} 

newdf(x, 4) 
#Error in newdf(x, 4) : 
# Number of columns is not a multiple of input vector length. Please double check. 

Если вы имели несколько векторов, сидя в list, вот как вы можете конвертировать каждый из них, чтобы быть data.frame:

> l <- list(x,y) 
> l 
#[[1]] 
#[1] 1 95 5 2 135 4 3 135 4 
# 
#[[2]] 
#[1] 1 70 3 2 110 4 3 112 4 

> lapply(l, newdf) 
#[[1]] 
# V1 V2 V3 
#1 1 70 3 
#2 2 110 4 
#3 3 112 4 
# 
#[[2]] 
# V1 V2 V3 
#1 1 70 3 
#2 2 110 4 
#3 3 112 4 
Смежные вопросы