如何根据 R 中的两列生成序列?
How to generate a sequence based on two columns in 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")
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
如果是我,我可能会将其保留为数据框之外的向量列表。
您可以在下方用 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")
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
如果是我,我可能会将其保留为数据框之外的向量列表。