试图复制数据框中的行?

时间:2016-04-17 23:58:11

标签: r dataframe rep

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))

我正在尝试从dataframe v创建一个数据帧v1,其中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 个答案:

答案 0 :(得分:3)

options_parser.parse!(args) raise "orphans found - have you forgotten commas?" if args.count > 1 不会那样工作 - 它只是将输出连接成一个向量,它看起来像rep的一行。然后,rbind修剪其输入以匹配最短的行。

相反,您可以在此处使用具有适当长度(5)的向量的rbind,并且每次都返回该行。 lapply这会为您提供行列表。您可以使用list_of_rows <- lapply(1:5, function(pass) list(4,5,"Deb","Jones",25))将其转换为包含5个相同行的矩阵。

您可以将该矩阵包装在do.call(rbind, list_of_rows)

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

感谢@thelatemail使用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 代替c来指出早期解决方案的问题

答案 1 :(得分:2)

您也可以传递一个0 -1 -1 -1 1 1 1 -1 3 3 -1 -1 6 6 6 6 对象来填充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