将重复的行添加到数据框中

时间:2015-07-31 09:21:18

标签: r for-loop dataframe

这可能已经在其他地方解决了,但我找不到任何具体的链接,所以我很高兴看到一个重复的"标签...

我的数据框的行如下所示:

  x y z lon lat count
1 A B C   0   0     3
2 B D Q   1   2     2

现在,用ggmap绘制数据(我是新的并且仍然在学习图形语法),特别是使用stat_bin2d我认为我应该转换上面的数据通过以下方式:

  x y z lon lat 
1 A B C   0   0
2 A B C   0   0
3 A B C   0   0
4 B D Q   1   2
5 B D Q   1   2

问题:

1)我的假设是否正确?

2)我如何实现目标?

我已经尝试了几种使用rbind而没有for循环的方法,但我没有解决我的问题...我能想到的唯一方法的知识就是

my_df <- structure(list(x = structure(1:2, .Label = c("A", "B"), class = "factor"), 
                        y = structure(1:2, .Label = c("B", "D"), class = "factor"), 
                        z = structure(1:2, .Label = c("C", "Q"), class = "factor"), 
                        lon = c(0, 1), lat = c(0, 2), count = c(3, 2)), 
                   .Names = c("x", "y", "z", "lon", "lat", "count"), 
row.names = 1:2, class = "data.frame")

for (i in 1:nrow(my_df)){
    for (j in 1:(my_df$count[i]-1)){
        my_df <- rbind(my_df, my_df[i,])}}
row.names(my_df) <- 1:nrow(my_df)
my_df <- my_df[,1:5]

结果是:

  x y z lon lat
1 A B C   0   0
2 B D Q   1   2
3 A B C   0   0
4 A B C   0   0
5 B D Q   1   2

它有效,但我想学习更好的方法来实现我的目标。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

my_df[rep(seq_len(nrow(my_df)), times = my_df$count), ]

请参阅此post

答案 1 :(得分:1)

我们可以使用来自expandRows的方便功能splitstackshape来按照“计数”来复制行。列。

library(splitstackshape)
res <- expandRows(my_df, 'count')
row.names(res) <- NULL
res
#  x y z lon lat
#1 A B C   0   0
#2 A B C   0   0
#3 A B C   0   0
#4 B D Q   1   2
#5 B D Q   1   2