У меня есть две последовательности данных (с пятью переменными в каждой последовательности), которые я хочу соответственно объединить в одну, используя эту рубрику:

variable sequence 1   variable sequence 2     variable in combined sequence     
        0                      0                            1
        0                      1                            2
        1                      0                            3
        1                      1                            4

Вот несколько примеров данных:

set.seed(145)
mm <- matrix(0, 5, 10)
df <- data.frame(apply(mm, c(1,2), function(x) sample(c(0,1),1)))
colnames(df) <- c("s1_1", "s1_2", "s1_3", "s1_4", "s1_5", "s2_1", "s2_2", "s2_3", "s2_4", "s2_5")
> df
  s1_1 s1_2 s1_3 s1_4 s1_5 s2_1 s2_2 s2_3 s2_4 s2_5
1    1    0    0    0    0    0    1    1    0    0
2    1    1    1    0    1    1    0    0    0    0
3    1    1    0    0    0    1    1    0    1    1
4    0    0    1    0    1    1    0    1    0    1
5    0    1    0    0    1    0    0    1    1    0

Здесь s1_1 представляет переменную 1 в последовательности 1, s2_1 представляет переменную 2 в последовательности 2 и так далее. В этом примере, s1_1 = 1 и s2_1 = 0, переменная 1 в комбинированной последовательности будет закодирована как 3. Как это сделать в R?

0
cliu 26 Ноя 2021 в 15:59

1 ответ

Лучший ответ

Вот способ -

return_value <- function(x, y) {
  dplyr::case_when(x == 0 & y == 0 ~ 1, 
                   x == 0 & y == 1 ~ 2, 
                   x == 1 & y == 0 ~ 3, 
                   x == 1 & y == 1 ~ 4)
}
sapply(split.default(df, sub('.*_', '', names(df))), function(x) 
       return_value(x[[1]], x[[2]]))

#     1 2 3 4 5
#[1,] 3 2 2 1 1
#[2,] 4 3 3 1 3
#[3,] 4 4 1 2 2
#[4,] 2 1 4 1 4
#[5,] 1 3 2 2 3 

split.default разделяет данные по последовательности и, используя sapply, мы применяем функцию return_value для сравнения двух столбцов в каждом фрейме данных.

1
Ronak Shah 26 Ноя 2021 в 16:12
Спасибо за решение @Ronak Shah!
 – 
cliu
26 Ноя 2021 в 16:47