2015-11-16 4 views
0

Ниже вы можете воссоздать мои данные в 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") 
+0

Похоже, у вас есть два вопроса: генерация последовательности и функции, основанные на значениях 'CORE'. Я предлагаю вам удалить функцию 'functiona'' functionb' 'functionc' из этого вопроса, поэтому он ориентирован на одну проблему. Вы можете задать новый вопрос о функциях. – Gregor

+0

Кроме того, среднее из равномерно распределенной последовательности между двумя числами будет таким же, как среднее из двух чисел. Поэтому, если вы просто генерируете последовательности для принятия средств, вы можете пропустить шаг в последовательности и принять средства напрямую. – Gregor

+0

Редактирование сейчас. functiona фактически является ступенчатой ​​функцией. Таким образом, создавая последовательность для моего диапазона (от BCl до BCu), я могу рассчитать средневзвешенное значение для диапазона, который странно падает на все этапы. Обновит вопрос с более подробной исходной информацией. – Dilliplaine33

ответ

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 

Если бы это было, я бы, вероятно, оставить его в виде списка векторов вне кадра данных.

+0

Это дает точные последовательности. Результат mapply не может быть непосредственно использован в функции позже, т. Е. Эта простая функция 'mean (seqs)', где идентичная последовательность возвращает результат 'mean (seq (23, 28, 0.001)) '. – Dilliplaine33

+0

Это потому, что 'mean' векторизован. Вам нужно сознательно применять среднее значение для каждой последовательности, например, 'lapply (seqs, mean)'. Если вы получите список последовательностей весов, вы можете снова использовать 'mapply':' mapply (weighted.mean, x = seqs, w = list_of_weight_vectors) '. – Gregor