объединить столбцы с одинаковым именем r - PullRequest
0 голосов
/ 04 мая 2018

Я работаю в R с набором данных, созданным из mongodb с использованием монголита.
Я получаю список, который выглядит так:

   _id A  B  A  B  A  B  NA NA
    1  a  1  b  2  e  5  NA NA 
    2  k  4  l  3  c  3  d  4 

Я хотел бы объединить набор данных, чтобы он выглядел следующим образом:

   _id A  B 
    1  a  1
    2  k  4
    1  b  2
    2  l  3
    1  e  5
    2  c  3
    1  NA NA
    2  d  4 

* * * * * В последних столбцах есть NAs, потому что столбцы названы из первой записи, и если более поздняя запись имеет больше столбцов, чем им, которым не присвоены имена (если я получу помощь для этого, как ну это было бы здорово, но это не причина, по которой я здесь). Также число столбцов может отличаться для разных подмножеств набора данных. Я пробовал melt(), но поскольку это список, а не информационный фрейм, он не работает должным образом, я пробовал stack(), но он не работает, поскольку столбцы имеют одинаковое имя, а некоторые из них не работают даже есть имя. Я знаю, что это очень странная ситуация, и ценю любую помощь. Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Мы можем использовать data.table. Предполагая, что A и B всегда следуют друг за другом. Я создал пример с 2 наборами NA в заголовке. С помощью grep мы можем найти те, которые fread назвали V8 и т. Д. Используя R переработку векторов, вы можете переименовать несколько заголовков за один раз. Если в вашем случае они названы по-другому, измените шаблон в команде grep. Затем мы расплавляем данные через via melt

library(data.table)

df <- fread("
               _id A  B  A  B  A  B  NA NA NA NA
                1  a  1  b  2  e  5  NA NA NA NA
                2  k  4  l  3  c  3  d  4 e 5",
            header = TRUE)

df
   _id A B A B A B    A  B    A  B
1:   1 a 1 b 2 e 5 <NA> NA <NA> NA
2:   2 k 4 l 3 c 3    d  4    e  5

# assuming A B are always following each other. Can be done in 1 statement.
cols <- names(df)
cols[grep(pattern = "^V", x = cols)] <- c("A", "B")
names(df) <- cols

# melt data (if df is a data.frame replace df with setDT(df)
df_melted <- melt(df, id.vars = 1, 
                  measure.vars = patterns(c('A', 'B')),
                  value.name=c('A', 'B'))

df_melted
    _id variable    A  B
 1:   1        1    a  1
 2:   2        1    k  4
 3:   1        2    b  2
 4:   2        2    l  3
 5:   1        3    e  5
 6:   2        3    c  3
 7:   1        4 <NA> NA
 8:   2        4    d  4
 9:   1        5 <NA> NA
10:   2        5    e  5
0 голосов
/ 08 мая 2018

Спасибо за вашу помощь, они были отличным источником вдохновения. Хотя @Andre Elrico дал решение, которое работало в воспроизводимом примере лучше, @phiver дало решение, которое работало лучше над моей общей проблемой. Используя оба, я придумал следующее.

library(data.table)
#The data were in a list of lists called list for this example
temp <- as.data.table(matrix(t(sapply(list, '[', seq(max(sapply(list, lenth))))), 
                            nrow = m)) 
# m here is the number of lists in list

cols <- names(temp)
cols[grep(pattern = "^V", x = cols)] <- c("B", "A") 
#They need to be the opposite way because the first column is going to be substituted with id, and this way they fall on the correct column after that
cols[1] <- "id"
names(temp) <- cols
l <- melt.data.table(temp, id.vars = 1, 
                           measure.vars = patterns(c("A", "B")), 
                           value.name = c("A", "B"))

Таким образом, я могу использовать это и в том случае, если у меня есть более 2 столбцов, которыми мне нужно так манипулировать.

0 голосов
/ 04 мая 2018

с использованием library(magrittr)

данные:

df <- fread("
               _id A  B  A  B  A  B  NA NA
    1  a  1  b  2  e  5  NA NA 
    2  k  4  l  3  c  3  d  4 ",header=T)
setDF(df)

Код:

df2 <- df[,-1]

odds<- df2 %>% ncol %>% {(1:.)%%2} %>% as.logical
even<- df2 %>% ncol %>% {!(1:.)%%2}

cbind(df[,1,drop=F],
      A=unlist(df2[,odds]),
      B=unlist(df2[,even]),
      row.names=NULL)

результат:

#   _id    A  B
# 1   1    a  1
# 2   2    k  4
# 3   1    b  2
# 4   2    l  3
# 5   1    e  5
# 6   2    c  3
# 7   1 <NA> NA
# 8   2    d  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...