Как упорядочить элементы фрейма данных, используя порядок столбцов группы, хранящийся в другом фрейме данных в R? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть два фрейма данных с одинаковым количеством строк. Фрагмент:

df1 <- data.frame(Id = c(123, 124, 125), X1 = c(1, 2, 1), X2 = c(NA_integer_, 1, 2))
df1
    Id X1  X2
1  123  1  NA
2  124  2   1
3  125  1   2
df2 <- data.frame(Id = c(123, 124, 125), X1_1 = c(NA_integer_, 2, 1), X1_2 = c(1, NA_integer_, 2), X1_3 = c(2, 3, 3), X2_1 = c(NA_integer_, 1, NA_integer_), X2_2 = c(NA_integer_, 3, NA_integer_), X2_3 = c(NA_integer_, 2, 2))
df2
  Id X1_1 X1_2 X1_3 X2_1 X2_2 X2_3
1 123  NA    1    2   NA   NA   NA
2 124   2   NA    3    1    3    2
3 125   1    2    3   NA   NA    2

Мне нужно создать список с упорядоченными элементами df2 соответственно, сгруппировать позиции из df1 и удалить NA:

$`123`
[1] 1 2

$`124`
[1] 1 3 2 2 3

$`125`
[1] 1 2 3 2

Как создать этот список в R?

UPD Пример реальных данных здесь .

Ответы [ 2 ]

3 голосов
/ 04 октября 2019

Вот один вариант

Map(function(u, v) {
     nm1 <- sub("_\\d+", "", names(v))
     grp <- match(nm1, unique(nm1))
     as.vector(na.omit(unlist(split.default(v, grp)[unlist(u)], use.names = FALSE)))

}, split(df1[-1], df1$Id), 
 split(df2[-1], df2$Id))    
#$`123`
#[1] 1 2

#$`124`
#[1] 1 3 2 2 3

#$`125`
#[1] 1 2 3 2
2 голосов
/ 07 октября 2019

Другой вариант с использованием lapply, sappy, sort и grep:

lapply(setNames(df1$Id, df1$Id), function(i) {
  x <- df2[df2$Id==i, unlist(lapply(paste0("^", names(sort(df1[df1$Id==i,-1])), "_"), grep, colnames(df2)))]
  x[!is.na(x)]
})
#$`123`
#[1] 1 2
#
#$`124`
#[1] 1 3 2 2 3
#
#$`125`
#[1] 1 2 3 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...