Дубликат строки в R с условием выполняется - PullRequest
0 голосов
/ 16 октября 2018

Я отчаянно пытаюсь решить проблему с моими данными, но я не могу найти на форумах ничего, что могло бы помочь (или я так мало знаю, что не ищу нужную вещь).

У меня есть следующие данные, и когда значение в колонке Мумбаи равно нулю, я хотел бы продублировать всю эту строку и скопировать ее внизу.

Есть ли способ сделать этов 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 голосов
/ 16 октября 2018
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, и дважды, если это так.В результате вы получите таблицу с дублированными строками в Мумбае == 0 (и номером их строки с добавлением .1).

0 голосов
/ 16 октября 2018

Вот один вариант с 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))),]
0 голосов
/ 16 октября 2018

Мы можем использовать bind_rows из dplyr, чтобы добавить строки к df, где Mumbai == 0.

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

Или использовать rbind из базы R

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...