R中符合条件的重复行

时间:2018-10-16 03:15:25

标签: r

我正拼命地试图解决我的数据问题,但是我似乎在论坛上找不到任何有帮助的东西(或者我知道的很少,我没有在寻找正确的东西)。 / p>

我有以下数据,当“孟买列”中的值等于零时,我想复制整行并将其复制到下面。

在R中有什么方法可以执行此操作吗?还是最好调用VBA脚本?

之前:

Row Shanghai    Mumbai  Beijing Paris   Hong Kong   Wellington
5.7 0.4 6.2 9.9 4.1 3.4
5.1 7.5 1.8 9.2 4.8 9.9
5.0 1.5 4.4 7.2 4.5 6.6
5.7 5.4 6.7 9.1 2.9 9.0
8.2 7.7 2.3 9.8 0.2 3.1
3.4 0.0 6.5 5.4 0.2 0.5
1.0 9.5 2.8 5.7 2.8 2.5
8.4 9.9 2.1 6.3 9.3 8.4
3.8 3.4 5.1 5.8 0.7 1.8
4.5 3.9 8.3 5.8 7.3 4.7
5.3 8.9 9.2 9.7 2.8 0.2
0.7 0.0 2.3 4.6 5.9 2.8
1.4 2.6 4.0 7.2 5.5 1.0
4.7 8.2 4.1 5.0 8.9 3.0
8.9 4.7 0.2 4.0 1.0 7.8

之后

Shanghai    Mumbai  Beijing Paris   Hong Kong   Wellington      
5.7 0.4 6.2 9.9 4.1 3.4     
5.1 7.5 1.8 9.2 4.8 9.9     
5.0 1.5 4.4 7.2 4.5 6.6     
5.7 5.4 6.7 9.1 2.9 9.0     
8.2 7.7 2.3 9.8 0.2 3.1     
3.4 0.0 6.5 5.4 0.2 0.5     
3.4 0.0 6.5 5.4 0.2 0.5     # DUPLICATE ROW
1.0 9.5 2.8 5.7 2.8 2.5     
8.4 9.9 2.1 6.3 9.3 8.4     
3.8 3.4 5.1 5.8 0.7 1.8     
4.5 3.9 8.3 5.8 7.3 4.7     
5.3 8.9 9.2 9.7 2.8 0.2     
0.7 0.0 2.3 4.6 5.9 2.8     
0.7 0.0 2.3 4.6 5.9 2.8     # DUPLICATE ROW
1.4 2.6 4.0 7.2 5.5 1.0     
4.7 8.2 4.1 5.0 8.9 3.0     
8.9 4.7 0.2 4.0 1.0 7.8     

输入数据:

structure(list(Shanghai = c(5.7, 5.1, 5, 5.7, 8.2, 3.4, 1, 8.4,             
3.8, 4.5, 5.3, 0.7, 1.4, 4.7, 8.9), Mumbai = c(0.4, 7.5, 1.5,           
5.4, 7.7, 0, 9.5, 9.9, 3.4, 3.9, 8.9, 0, 2.6, 8.2, 4.7), Beijing = c(6.2,           
1.8, 4.4, 6.7, 2.3, 6.5, 2.8, 2.1, 5.1, 8.3, 9.2, 2.3, 4, 4.1,          
0.2), Paris = c(9.9, 9.2, 7.2, 9.1, 9.8, 5.4, 5.7, 6.3, 5.8,            
5.8, 9.7, 4.6, 7.2, 5, 4), Hong.Kong = c(4.1, 4.8, 4.5, 2.9,            
0.2, 0.2, 2.8, 9.3, 0.7, 7.3, 2.8, 5.9, 5.5, 8.9, 1), Wellington = c(3.4,           
9.9, 6.6, 9, 3.1, 0.5, 2.5, 8.4, 1.8, 4.7, 0.2, 2.8, 1, 3, 7.8          
)), class = "data.frame", row.names = c(NA, -15L))          

3 个答案:

答案 0 :(得分:2)

df.expanded <- df[rep(row.names(df), ifelse(df$Mumbai==0.0,2,1)),]

df.expanded
     Shanghai Mumbai Beijing Paris Hong.Kong Wellington
1         5.7    0.4     6.2   9.9       4.1        3.4
2         5.1    7.5     1.8   9.2       4.8        9.9
3         5.0    1.5     4.4   7.2       4.5        6.6
4         5.7    5.4     6.7   9.1       2.9        9.0
5         8.2    7.7     2.3   9.8       0.2        3.1
6         3.4    0.0     6.5   5.4       0.2        0.5
6.1       3.4    0.0     6.5   5.4       0.2        0.5
7         1.0    9.5     2.8   5.7       2.8        2.5
8         8.4    9.9     2.1   6.3       9.3        8.4
9         3.8    3.4     5.1   5.8       0.7        1.8
10        4.5    3.9     8.3   5.8       7.3        4.7
11        5.3    8.9     9.2   9.7       2.8        0.2
12        0.7    0.0     2.3   4.6       5.9        2.8
12.1      0.7    0.0     2.3   4.6       5.9        2.8
13        1.4    2.6     4.0   7.2       5.5        1.0
14        4.7    8.2     4.1   5.0       8.9        3.0
15        8.9    4.7     0.2   4.0       1.0        7.8

这为什么起作用: 此子集调用请求行名列表,如果孟买不等于0,则每个行名(即数字)重复一次,如果重复,则两次。结果,您得到一个表,该表具有重复的Mumbai == 0行(其行号带有添加的.1)。

答案 1 :(得分:1)

我们可以使用bind_rows中的dplyr将行添加到df,其中Mumbai == 0

library(dplyr)
bind_rows(df, df %>%
     filter(Mumbai == 0))

或使用基数R中的rbind

rbind(df, df[df$Mumbai == 0,])

如果我们想在下面添加重复的行,则可以

df[sort(c(1:nrow(df) , which(df$Mumbai == 0))), ]

#     Shanghai Mumbai Beijing Paris Hong.Kong Wellington
#1         5.7    0.4     6.2   9.9       4.1        3.4
#2         5.1    7.5     1.8   9.2       4.8        9.9
#3         5.0    1.5     4.4   7.2       4.5        6.6
#4         5.7    5.4     6.7   9.1       2.9        9.0
#5         8.2    7.7     2.3   9.8       0.2        3.1
#6         3.4    0.0     6.5   5.4       0.2        0.5
#6.1       3.4    0.0     6.5   5.4       0.2        0.5
#7         1.0    9.5     2.8   5.7       2.8        2.5
#8         8.4    9.9     2.1   6.3       9.3        8.4
#9         3.8    3.4     5.1   5.8       0.7        1.8
#10        4.5    3.9     8.3   5.8       7.3        4.7
#11        5.3    8.9     9.2   9.7       2.8        0.2
#12        0.7    0.0     2.3   4.6       5.9        2.8
#12.1      0.7    0.0     2.3   4.6       5.9        2.8
#13        1.4    2.6     4.0   7.2       5.5        1.0
#14        4.7    8.2     4.1   5.0       8.9        3.0
#15        8.9    4.7     0.2   4.0       1.0        7.8

答案 2 :(得分:0)

这是data.table

的一个选项
library(data.table)
setDT(df)[, .SD[sort(c(seq_len(.N),.I[!Mumbai]))]]
#    Shanghai Mumbai Beijing Paris Hong.Kong Wellington
# 1:      5.7    0.4     6.2   9.9       4.1        3.4
# 2:      5.1    7.5     1.8   9.2       4.8        9.9
# 3:      5.0    1.5     4.4   7.2       4.5        6.6
# 4:      5.7    5.4     6.7   9.1       2.9        9.0
# 5:      8.2    7.7     2.3   9.8       0.2        3.1
# 6:      3.4    0.0     6.5   5.4       0.2        0.5
# 7:      3.4    0.0     6.5   5.4       0.2        0.5
# 8:      1.0    9.5     2.8   5.7       2.8        2.5
# 9:      8.4    9.9     2.1   6.3       9.3        8.4
#10:      3.8    3.4     5.1   5.8       0.7        1.8
#11:      4.5    3.9     8.3   5.8       7.3        4.7
#12:      5.3    8.9     9.2   9.7       2.8        0.2
#13:      0.7    0.0     2.3   4.6       5.9        2.8
#14:      0.7    0.0     2.3   4.6       5.9        2.8
#15:      1.4    2.6     4.0   7.2       5.5        1.0
#16:      4.7    8.2     4.1   5.0       8.9        3.0
#17:      8.9    4.7     0.2   4.0       1.0        7.8

setDT(df)[df[, sort(c(seq_len(.N),.I[!Mumbai]))]]

或使用tidyverse

library(tidyverse)
df %>% 
   mutate(n = (!Mumbai) + 1) %>%
   uncount(n)

或与base R

df[sort(c(seq_len(nrow(df)), which(!df$Mumbai))),]