2016-04-17 1 views
1
v 

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

В командной строке я выпустил следующую команду.Пытается реплицировать строки в dataframe?

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

Я пытаюсь сделать dataframe v1 из dataframe 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 раз?

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

Благодаря

+0

'rep' создает вектор с 5 копий "4 5 Deb Jones 25" в одной строке – jaimedash

+0

Спасибо большое – MrsDP

ответ

3

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

+0

Большое спасибо. – MrsDP

+1

Помните, что это заставляет все воспринимать как символ (а затем и фактор) - например. - проверить результаты 'c (4,5,« Deb »,« Jones », 25)' - что-то вроде 'setNames (data.frame (список (4,5,« Deb »,« Jones », 25)), имена (v)) [rep (1,5),] 'может быть переводом для обеспечения того, что числовые данные остаются числовыми. – thelatemail

+0

Вы можете избежать этого, заменив 'c' на' list' в ответе, но затем у data.frame есть столбцы списка ... О, но использование 'unlist' может исправить это. Спасибо. Я отредактировал ответ – jaimedash

2

Вы также можете просто передать 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) 
+0

Большое спасибо – MrsDP

 Смежные вопросы

  • Нет связанных вопросов^_^