2016-09-09 4 views
2

У меня есть кадр данных формыПреобразование г dataframe правильный формат для использования REP

A = data.frame(c(1485,1486,1701,1808)) 
names(A) <- c("ID") 

и второй кадр данных формы

B = data.frame(1:12) 
names(B) <- "value" 

Я хочу, чтобы иметь возможность использовать это с rep, чтобы сформировать второй столбец в B таким образом, что у меня

B$new <- rep(A,each = 3, length.out = 12) 

давая

> B 
    value new 
1  1 1485 
2  2 1485 
3  3 1485 
4  4 1486 
5  5 1486 
6  6 1486 
7  7 1701 
8  8 1701 
9  9 1701 
10 10 1808 
11 11 1808 
12 12 1808 

Это работает нормально, если я определяю A = c(1485,1486,1701,1808), но поскольку A - это кадр данных, это не так. Как преобразовать A в правильную форму для использования с rep? Я попытался as.list, as.vector, as.integer безуспешно.

ответ

3

Поскольку A - это кадр данных, вам необходимо указать, какой столбец вы хотите повторить. (Здесь ID)

B$new <- rep(A$ID,each = 3, length.out = 12) 
B 

# value new 
#1  1 1485 
#2  2 1485 
#3  3 1485 
#4  4 1486 
#5  5 1486 
#6  6 1486 
#7  7 1701 
#8  8 1701 
#9  9 1701 
#10 10 1808 
#11 11 1808 
#12 12 1808 

В вашем случае, это также будет работать без использования length.out аргумента

rep(A$ID,each = 3) 

Он будет повторять каждый ID в A 3 раза, давая тот же результат.

+2

Или 'cbind (A [представитель (seq_len (nrow (A)), каждый = 3) ,, падение = FALSE], B)', если у вас есть 'Ā', содержащий любое количество столбцов. – thelatemail

+0

Определенно! Это может быть отдельный ответ. Просто из любопытства, что делает 'drop = FALSE'? Отбрасывает ли это имя столбца? –

+1

Он останавливает выделение от возврата к вектору и сохраняет формат 'data.frame'. – thelatemail

1
If A is a data frame you can use rep function in this way 

A = data.frame(c(1485,1486,1701,1808)) 
names(A) <- c("ID") 

B = data.frame(1:12) 
names(B) <- "value" 


B$new <- sort(unlist(rep(A,times=3))) 

print(B) 
    value new 
1  1 1485 
2  2 1485 
3  3 1485 
4  4 1486 
5  5 1486 
6  6 1486 
7  7 1701 
8  8 1701 
9  9 1701 
10 10 1808 
11 11 1808 
12 12 1808