Пытаетесь реплицировать строки в кадре данных?

v

  id a    b     c  d
1  1 1 Adam Smith 10
2  2 2 John  Bond 15
3  3 3  Sam   Ted 20

Я выдал следующую команду в командной строке.

> v1<-rbind(v,rep(c(4,5,"Deb","Jones",25),5))

Я пытаюсь сделать фрейм данных v1 из фрейма данных v, где v1 должен выглядеть следующим образом:

> v1

  id a    b     c  d
1  1 1 Adam Smith 10
2  2 2 John  Bond 15
3  3 3  Sam   Ted 20
4  4 5  Deb Jones 25
5  4 5  Deb Jones 25
6  4 5  Deb Jones 25
7  4 5  Deb Jones 25
8  4 5  Deb Jones 25

Но то, что я на самом деле получаю, это:

> v1

  id a    b     c  d
1  1 1 Adam Smith 10
2  2 2 John  Bond 15
3  3 3  Sam   Ted 20
4  4 5  Deb Jones 25

Почему скандал "4 5 Deb Jones 25" появляется только один раз в v1вместо 5 раз?

Новичок здесь. Поэтому, пожалуйста, объясните простым английским языком. Вся помощь приветствуется.

Спасибо

2 ответа

rep не работает таким образом - он просто объединит выходные данные в вектор, который выглядит как одна строка rbind, Затем, rbind обрезает свои входы, чтобы соответствовать строке самой короткой длины.

Вместо этого вы можете использовать lapply на вектор с соответствующей длиной (5) и возвращать строку каждый раз. list_of_rows <- lapply(1:5, function(pass) list(4,5,"Deb","Jones",25)) Это дает вам список строк. Ты можешь использовать do.call(rbind, list_of_rows) превратить это в матрицу с 5 одинаковыми строками.

Вы можете обернуть эту матрицу в data.frame:

df_tmp <- data.frame(do.call(rbind, lapply(1:5, function(pass) list(4,5,"Deb","Jones",25))))

  X1 X2  X3    X4 X5
1  4  5 Deb Jones 25
2  4  5 Deb Jones 25
3  4  5 Deb Jones 25
4  4  5 Deb Jones 25
5  4  5 Deb Jones 25

В то время как df_tmp выглядит нормально, каждый столбец на самом деле является списком, с которым надо работать. Вы можете это исправить с помощью unlist

df <-lapply(df_tmp, unlist)
str(df)

 List of 5
 $ X1: num [1:5] 4 4 4 4 4
 $ X2: num [1:5] 5 5 5 5 5
 $ X3: chr [1:5] "Deb" "Deb" "Deb" "Deb" ...
 $ X4: chr [1:5] "Jones" "Jones" "Jones" "Jones" ...
 $ X5: num [1:5] 25 25 25 25 25

Спасибо @thelatemail за указание на проблему с более ранним решением, используя c вместо list

Вы также можете просто передать list объект для заполнения строк, которые вы хотите в v,

v[4:8,] <- list(4,5,"Deb","Jones",25)
# or without knowing the number of rows:
v[(nrow(v)+1):(nrow(v)+5),] <- list(4,5,"Deb","Jones",25)

#  id a    b     c  d
#1  1 1 Adam Smith 10
#2  2 2 John  Bond 15
#3  3 3  Sam   Ted 20
#4  4 5  Deb Jones 25
#5  4 5  Deb Jones 25
#6  4 5  Deb Jones 25
#7  4 5  Deb Jones 25
#8  4 5  Deb Jones 25

куда v было:

v <- data.frame(id=1:3, a=1:3, b=c("Adam","John","Sam"),
     c=c("Smith","Bond","Ted"), d=c(10,15,20), stringsAsFactors=FALSE) 
Другие вопросы по тегам