Сопоставьте столбцы со строками и вычтите из столбцов

мои данные выглядят так:

     >dput(mea)
     >structure(list(mea = c(NA, NA, NA, NA, 7.5, 19.5)), .Names = "mea",
     row.names = c(NA,-6L), class = "data.frame")

и

     >dput(m1)
     >structure(list(t = c(5e-04, 0.001, 0.0015, 0.002, 0.0025, 0.003, 
     0.0035, 0.004, 0.0045, 0.005, 0.0055, 0.006, 0.0065, 0.007, 0.0075, 
     0.008, 0.0085, 0.009, 0.0095, 0.01, 0.0105, 0.011, 0.0115, 0.012, 
     0.0125, 0.013, 0.0135, 0.014, 0.0145, 0.015), a = c(21L, 13L, 
     17L, 20L, 19L, 9L, 11L, 16L, 28L, 10L, 14L, 12L, 15L, 27L, 30L, 
     6L, 29L, 22L, 24L, 5L, 25L, 18L, 26L, 1L, 3L, 4L, 23L, 8L, 7L, 
     2L), b = c(1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1), c = c(19L, 25L, 14L, 
     18L, 3L, 4L, 5L, 6L, 8L, 20L, 17L, 13L, 28L, 2L, 29L, 15L, 26L, 
     12L, 24L, 16L, 9L, 1L, 22L, 27L, 21L, 23L, 11L, 10L, 7L, 30L), 
     `4` = c(NA, NA, NA, 18L, 3L, 4L, 5L, 6L, 8L, 20L, 17L, 13L, 
     NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
     NA, NA, NA), `17` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
     NA, NA, NA, NA, NA, NA, NA, 26L, 12L, 24L, 16L, 9L, 1L, 22L, 
     27L, 21L, NA, NA, NA, NA, NA), `<NA>` = c(NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_)), class = "data.frame",
     row.names = c(NA,30L), .Names = c("t", "a", "b", "c", "4", "17", "<NA>"))

Я пытаюсь сопоставить имена строк mea с именами столбцов m1, а затем вычесть соответствующее значение mea из всего столбца m1 (которое соответствует имени строки mea).

Что я сделал:

    mea1<-na.omit(mea)
    idx <- match(rownames(mea1) , 1:ncol(m1)) 
    m5 <- cbind((m1[,idx] - mea[idx,]), m1[,-idx])

Я получил это из заданного здесь вопроса: https://stackoverflow.com/a/18077661/5681674

Это делает трюк, но неправильным способом. Он вычитает второе (последнее значение) mea из первого сопоставленного столбца m1 и первое значение mea из второго сопоставленного столбца m1. Но это должно быть в правильном порядке. Я где-то читал, что cbind работает от начала до конца, в этом проблема? И как я могу это решить?

Заранее спасибо!

С уважением, Крис


person Chris    schedule 30.11.2017    source источник
comment
Думали ли вы о переносе mea (t(mea)), чтобы упростить   -  person Emmanuel-Lin    schedule 30.11.2017


Ответы (1)


Проблема в том, что вы пытаетесь вычесть вектор из data.frame, поэтому элементы вектора перерабатываются. На самом деле это не вычитание элементов в «неправильном» направлении (т.е. 19.5 из столбца 1 и 7.5 из столбца 2). Вместо этого происходит то, что 19.5 и 7.5 вычитаются из каждого столбца в чередующемся порядке (поскольку элементы перерабатываются, чтобы соответствовать длине столбца.

Например, проверьте head((m1[,idx] - mea[idx,])) по сравнению с head(m1[,idx]). Вы увидите, что строка 4 — это -1.5 или 18 - 19.5, а строка 5 — это -4.5 или 3 - 7.5.

Чтобы исправить это, вы можете использовать mapply вместо этого:

m5 <- cbind(mapply("-", m1[,idx], mea[idx,]), m1[,-idx])

Теперь, если мы посмотрим на head(m5[,c(1,2)]), мы увидим:

    4 17
1   NA NA
2   NA NA
3   NA NA
4 10.5 NA
5 -4.5 NA
6 -3.5 NA

Или что 7.5 правильно вычитается из всего первого столбца. Если вы проверите второй столбец, вы также увидите, что 19.5 правильно вычитается из всего столбца.

person Mike H.    schedule 30.11.2017
comment
Спасибо, @Mike H.! Вот и все! И спасибо за объяснение, а также. Это очень помогло. - person Chris; 30.11.2017