满足条件的R中的重复行

满足条件的R中的重复行,r,R,我拼命想用我的数据解决一个问题,但我似乎在论坛上找不到任何有帮助的东西(或者我知道的太少,以至于我没有寻找正确的东西) 我有以下数据,当Mumbai列中的值等于零时,我想复制整行并将其复制到下面 在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.

我拼命想用我的数据解决一个问题,但我似乎在论坛上找不到任何有帮助的东西(或者我知道的太少,以至于我没有寻找正确的东西)

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

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

我们可以使用
bind_rows
from
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

df.expanded这里有一个带有
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


或者使用
tidyverse

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

或使用
base R

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

但是这个解决方案并没有按照OP的要求将重复的行直接添加到
Mumbai==0
的行下面。@iod我认为OP希望使用数据帧进行进一步的操作,所以顺序无关紧要。也许你是对的,我添加了另一种方法来维持秩序。谢谢:)
library(tidyverse)
df %>% 
   mutate(n = (!Mumbai) + 1) %>%
   uncount(n)
df[sort(c(seq_len(nrow(df)), which(!df$Mumbai))),]