带条件扩展数据框

时间:2018-10-12 10:20:32

标签: r dataframe duplicates

我想使用自己的元素的重复项,但要在特定条件下扩展数据框。

这是我的示例数据:

x1 <- c(1, 2, 3, 4, 5)
x2 <- c(2, 2, 2, 2, 2)
y1 <- c(9, 9, 8, 9, 9)
y2 <- c(0, 0, 0, 1, 1)

df <- data.frame(x1, x2, y1, y2)
df   

  x1 x2 y1 y2
1  1  2  9  0
2  2  2  9  0
3  3  2  8  0
4  4  2  9  1
5  5  2  9  1

条件:仅当y1 = 9和y2 = 0时重复。因此输出应如下所示:

  x1 x2 y1 y2
1  1  2  9  0
2  2  2  9  0
3  3  2  8  0
4  4  2  9  1
5  5  2  9  1
6  1  2  9  0
7  2  2  9  0

案例1和2被复制,因此数据帧被扩展(新的行6和7)。情况3、4和5被忽略,不满足条件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我们可以使用which来获得满足条件的行的行索引,而仅将rbind的行一起添加到原始数据帧中即可。

inds <- which(df$y1 == 9 & df$y2 == 0)
rbind(df, df[inds,])

#  x1 x2 y1 y2
#1  1  2  9  0
#2  2  2  9  0
#3  3  2  8  0
#4  4  2  9  1
#5  5  2  9  1
#6  1  2  9  0
#7  2  2  9  0

或使用dplyr bind_rows

library(dplyr)

bind_rows(df, 
df %>%
  filter(y1 == 9 & y2 == 0))

如果我们想将y1的重复行的值更改为10,我们可以这样做

bind_rows(df, 
          df %>%
            filter(y1 == 9 & y2 == 0) %>% 
            mutate(y1 = 10)
          )

#  x1 x2 y1 y2
#1  1  2  9  0
#2  2  2  9  0
#3  3  2  8  0
#4  4  2  9  1
#5  5  2  9  1
#6  1  2 10  0
#7  2  2 10  0