Как выровнять столбцы с одинаковыми именами в r? - PullRequest
1 голос
/ 11 мая 2019

У меня разные столбцы с одинаковыми именами столбцов.

По первым данным;каждый столбец имеет 16 строк.

longdata<-structure(list(X2012 = c(0, 0.4, 0.8, 0.2, 0, 0, 0.2, 1.8, 0.8, 
3.6, 0.2, 0, 0.8, 4, 5.6, 4.2), X2013 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X2014 = c(0.4, 0.6, 
0.6, 0, 0, 0, 0.4, 0.2, 0.2, 0, 0.2, 0, 0, 0.2, 0, 0)), .Names = c("X2012", 
"X2013", "X2014"), class = "data.frame", row.names = c(NA, -16L
))

Во вторых данных каждый столбец состоит из 6 строк.

shortdata<-structure(list(X2012 = c(0.2, 0.4, 0.6, 0.2, 0.2, 0.2), X2013 = c(0, 
0.2, 0, 0, 0.2, 0), X2014 = c(0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("X2012", 
"X2013", "X2014"), class = "data.frame", row.names = c(NA, -6L
)) 

И вот что я хочу сделать;

finaldata<-structure(list(X2012 = c(0, 0.4, 0.8, 0.2, 0, 0, 0.2, 1.8, 0.8, 
3.6, 0.2, 0, 0.8, 4, 5.6, 4.2), X2012.1 = c(0.2, 0.4, 0.6, 0.2, 
0.2, 0.2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X2013 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    X2013.1 = c(0, 0.2, 0, 0, 0.2, 0, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA), X2014 = c(0.4, 0.6, 0.6, 0, 0, 0, 0.4, 0.2, 
    0.2, 0, 0.2, 0, 0, 0.2, 0, 0), X2014.1 = c(0L, 0L, 0L, 0L, 
    0L, 0L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("X2012", 
"X2012.1", "X2013", "X2013.1", "X2014", "X2014.1"), class = "data.frame", row.names = c(NA, 
-16L))

Ответы [ 2 ]

4 голосов
/ 11 мая 2019

Одна dplyr возможность может быть:

longdata %>%
 rowid_to_column() %>%
 left_join(shortdata %>%
            rowid_to_column(), by = c("rowid" = "rowid"), suffix = c("", ".1")) %>%
 select(-rowid)

Здесь выполняется левое соединение на основе идентификатора строки.

   X2012 X2013 X2014 X2012.1 X2013.1 X2014.1
1    0.0     0   0.4     0.2     0.0       0
2    0.4     0   0.6     0.4     0.2       0
3    0.8     0   0.6     0.6     0.0       0
4    0.2     0   0.0     0.2     0.0       0
5    0.0     0   0.0     0.2     0.2       0
6    0.0     0   0.0     0.2     0.0       0
7    0.2     0   0.4      NA      NA      NA
8    1.8     0   0.2      NA      NA      NA
9    0.8     0   0.2      NA      NA      NA
10   3.6     0   0.0      NA      NA      NA
11   0.2     0   0.2      NA      NA      NA
12   0.0     0   0.0      NA      NA      NA
13   0.8     0   0.0      NA      NA      NA
14   4.0     0   0.2      NA      NA      NA
15   5.6     0   0.0      NA      NA      NA
16   4.2     0   0.0      NA      NA      NA

Или та же идея с base R:

longdata$rowid <- seq_along(longdata$X2012)
shortdata$rowid <- seq_along(shortdata$X2012)

merge(longdata, shortdata, by = "rowid", all = TRUE, suffixes = c("", ".1"))[, -1]

Или еще более упрощенно (предложено @Ronak Shah):

merge(longdata, shortdata, by = "row.names", all = TRUE, suffixes = c("", ".1"))[, -1]
1 голос
/ 11 мая 2019

Мы могли бы использовать rowr::cbind.fill, сделать имена уникальными, используя make.unique и order их.

df1 <- rowr::cbind.fill(longdata, shortdata, fill = NA)
names(df1) <- make.unique(names(df1))
df1[order(names(df1))]


#   X2012 X2012.1 X2013 X2013.1 X2014 X2014.1
#1    0.0     0.2     0     0.0   0.4       0
#2    0.4     0.4     0     0.2   0.6       0
#3    0.8     0.6     0     0.0   0.6       0
#4    0.2     0.2     0     0.0   0.0       0
#5    0.0     0.2     0     0.2   0.0       0
#6    0.0     0.2     0     0.0   0.0       0
#7    0.2      NA     0      NA   0.4      NA
#8    1.8      NA     0      NA   0.2      NA
#9    0.8      NA     0      NA   0.2      NA
#10   3.6      NA     0      NA   0.0      NA
#11   0.2      NA     0      NA   0.2      NA
#12   0.0      NA     0      NA   0.0      NA
#13   0.8      NA     0      NA   0.0      NA
#14   4.0      NA     0      NA   0.2      NA
#15   5.6      NA     0      NA   0.0      NA
#16   4.2      NA     0      NA   0.0      NA

В базе R вы можете использовать match номера строк и cbind

cbind(longdata,shortdata[match(seq_len(nrow(longdata)), seq_len(nrow(shortdata))),])

Возможно, вам придется использовать make.unique, чтобы сделать имена уникальными и в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...