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

我在提示符下发出了以下命令。

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

我正在尝试从数据帧 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 次?

新手来了 所以请用简单的英语解释。所有帮助表示赞赏。

谢谢

4

2 回答 2

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 个相同行的矩阵。

您可以将该矩阵包装在 a 中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

于 2016-04-18T00:12:20.553 回答
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) 
于 2016-04-18T00:18:04.023 回答