Как создать последовательность на основе двух столбцов в R?

Ниже вы можете воссоздать мои данные в R. Я хотел бы создать последовательность чисел на основе двух отдельных столбцов. В этом примере реальных данных мои имена столбцов:

df= or10x1BC

"Tank" "Core" "BCl"  "BCu"  "Mid"  "TL"   "SL"

Я хочу использовать значение в каждой строке из BCu и BCl для создания последовательности на 0,001. Например, seq(BCu[1], BCl[1], 0.001) будет генерировать последовательность на основе первой строки в каждой, я хочу, чтобы эта работа работала для каждой строки вниз по списку.

В конечном итоге эта последовательность будет использоваться в моей функции для усреднения последовательности, т. е. mean(function(seq(Bcu[i], BCl[j], 0.001)), и будет добавлена ​​в новый столбец or10x1BC["meanBVF"] = mean(function(seq(Bcu[i], BCl[j], 0.001)).

См. данные ниже:


structure(list(Tank = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "1", class = "factor"), Core = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    BCl = structure(c(8L, 5L, 2L, 6L, 3L, 1L, 9L, 7L, 4L), .Label = c("17", 
    "18", "22", "22.3", "23", "26", "27.3", "28", "29"), class = "factor"), 
    BCu = structure(c(8L, 5L, 2L, 6L, 3L, 1L, 9L, 7L, 4L), .Label = c("12.5", 
    "13.5", "17", "17.8", "18", "22", "22.3", "23", "27.3"), class = "factor"), 
    Mid = structure(c(8L, 5L, 2L, 6L, 3L, 1L, 9L, 7L, 4L), .Label = c("14.75", 
    "15.75", "19.5", "20.05", "20.5", "24", "24.8", "25.5", "28.15"
    ), class = "factor"), TL = structure(c(2L, 2L, 2L, 1L, 1L, 
    1L, 3L, 3L, 3L), .Label = c("26", "28", "29"), class = "factor"), 
    SL = structure(c(4L, 4L, 3L, 2L, 4L, 3L, 1L, 4L, 3L), .Label = c("1.7", 
    "4", "4.5", "5"), class = "factor")), .Names = c("Tank", 
"Core", "BCl", "BCu", "Mid", "TL", "SL"), row.names = c(NA, -9L
), class = "data.frame")

person Dilliplaine33    schedule 16.11.2015    source источник
comment
Похоже, у вас есть два вопроса: генерация последовательности и функции, основанные на значениях CORE. Я бы посоветовал вам удалить информацию functiona functionb functionc из этого вопроса, чтобы он был сосредоточен на одной проблеме. Вы можете задать новый вопрос о функциях.   -  person Gregor Thomas    schedule 17.11.2015
comment
Кроме того, среднее значение равномерно распределенной последовательности между двумя числами будет таким же, как среднее значение двух чисел. Поэтому, если вы просто генерируете последовательности для получения средних значений, вы можете пропустить шаг последовательности и напрямую использовать средние значения.   -  person Gregor Thomas    schedule 17.11.2015
comment
Редактирую сейчас. functiona на самом деле является ступенчатой ​​функцией. Таким образом, сгенерировав последовательность для моего диапазона (от BCl до BCU), я могу вычислить средневзвешенное значение для диапазона, который неравномерно попадает по шагам. Будет обновлен вопрос с более подробной справочной информацией.   -  person Dilliplaine33    schedule 17.11.2015
comment
Кроме того, в вашем dput все ваши данные являются факторами. Вы должны преобразовать все числа (по крайней мере, BCl, BCu, Mid и т. д.) в числовые, используя as.numeric(as.character(x))   -  person Gregor Thomas    schedule 17.11.2015


Ответы (1)


mapply похоже на apply или lapply, но с несколькими аргументами:

Во-первых, как я уже упоминал в комментарии, нам нужно преобразовать ваши данные в числовые. Я сделал это так, чтобы преобразовать все, кроме второго столбца:

df[, -2] = lapply(df[, -2], as.character)
df[, -2] = lapply(df[, -2], as.numeric)

Затем мы можем использовать mapply для генерации последовательностей:

seqs = mapply(FUN = function(a, b) {
      seq(from = a, to = b, by = .001)
  }, a = df$BCu, b = df$BCl)

Кажется грязным помещать это во фрейм данных, но вы можете, если хотите:

df$seqs = seqs

Если бы это был я, я бы, вероятно, оставил это как список векторов за пределами фрейма данных.

person Gregor Thomas    schedule 16.11.2015
comment
Это производит точные последовательности. Однако результат mapply не может быть напрямую использован в функции позже, то есть эта простая функция mean(seqs), где идентичная последовательность возвращает результат mean(seq(23, 28, 0.001)). - person Dilliplaine33; 17.11.2015
comment
Это потому, что mean векторизовано. Вам нужно намеренно применять среднее значение к каждой последовательности, например, lapply(seqs, mean). Если вы получите список последовательностей весов, вы можете снова использовать mapply: mapply(weighted.mean, x = seqs, w = list_of_weight_vectors). - person Gregor Thomas; 17.11.2015