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