Пытаетесь реплицировать строки в кадре данных?
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)