将向量的每个元素并行应用于相应的数据帧行
Applying each element of a vector to corresponding dataframe rows in parallel
我有一个数据框,其中前 3 列是最后一列的标签名称,这是一个矩阵列表。每个矩阵都是二进制的(只有 1 和 0)。我想从每一行中提取一个标签名称,并将该行矩阵中的所有值 1 替换为该标签名称,但我想避免使用循环,以便我可以对所有行并行执行此操作。
示例数据框:
> df1
name scenario Fire
1 name1 scene1 1, 1, 1, 0
2 name2 scene2 0, 1, 0, 1
3 name3 scene3 0, 0, 0, 1
> class(df1$Fire)
[1] "list"
> df1$Fire
[[1]]
[,1] [,2]
[1,] 1 1
[2,] 1 0
[[2]]
[,1] [,2]
[1,] 0 0
[2,] 1 1
[[3]]
[,1] [,2]
[1,] 0 0
[2,] 0 1
目标格式看起来像这样...
> df1$Fire
[[1]]
[,1] [,2]
[1,] "scene1" "scene1"
[2,] "scene1" "0"
[[2]]
[,1] [,2]
[1,] "0" "0"
[2,] "scene2" "scene2"
[[3]]
[,1] [,2]
[1,] "0" "0"
[2,] "0" "scene"
我曾尝试使用 apply(df1,1,function)
方法,但没有成功,因为生成的输出是列表格式,而不是获得 df1 的原始结构。有什么想法吗?
您可以使用 Map
:
df1$Fire <- Map(function(x, y) replace(x, x == 1, y), df1$Fire, df1$scenario)
df1$Fire
#[[1]]
# [,1] [,2]
#[1,] "scene1" "scene1"
#[2,] "scene1" "0"
#[[2]]
# [,1] [,2]
#[1,] "0" "0"
#[2,] "scene2" "scene2"
#[[3]]
# [,1] [,2]
#[1,] "0" "0"
#[2,] "0" "scene3"
数据
通常情况下,如果您使用 dput
以可重现的形式添加数据会更好,这样我们就不必从头开始构造它。
df1 <- structure(list(name = c("name1", "name2", "name3"), scenario = c("scene1",
"scene2", "scene3"), Fire = list(structure(c(1, 1, 1, 0), .Dim = c(2L,
2L)), structure(c(0, 1, 0, 1),.Dim = c(2L, 2L)), structure(c(0,
0, 0, 1),.Dim = c(2L, 2L)))),row.names = c("1", "2", "3"),class = "data.frame")
我有一个数据框,其中前 3 列是最后一列的标签名称,这是一个矩阵列表。每个矩阵都是二进制的(只有 1 和 0)。我想从每一行中提取一个标签名称,并将该行矩阵中的所有值 1 替换为该标签名称,但我想避免使用循环,以便我可以对所有行并行执行此操作。
示例数据框:
> df1
name scenario Fire
1 name1 scene1 1, 1, 1, 0
2 name2 scene2 0, 1, 0, 1
3 name3 scene3 0, 0, 0, 1
> class(df1$Fire)
[1] "list"
> df1$Fire
[[1]]
[,1] [,2]
[1,] 1 1
[2,] 1 0
[[2]]
[,1] [,2]
[1,] 0 0
[2,] 1 1
[[3]]
[,1] [,2]
[1,] 0 0
[2,] 0 1
目标格式看起来像这样...
> df1$Fire
[[1]]
[,1] [,2]
[1,] "scene1" "scene1"
[2,] "scene1" "0"
[[2]]
[,1] [,2]
[1,] "0" "0"
[2,] "scene2" "scene2"
[[3]]
[,1] [,2]
[1,] "0" "0"
[2,] "0" "scene"
我曾尝试使用 apply(df1,1,function)
方法,但没有成功,因为生成的输出是列表格式,而不是获得 df1 的原始结构。有什么想法吗?
您可以使用 Map
:
df1$Fire <- Map(function(x, y) replace(x, x == 1, y), df1$Fire, df1$scenario)
df1$Fire
#[[1]]
# [,1] [,2]
#[1,] "scene1" "scene1"
#[2,] "scene1" "0"
#[[2]]
# [,1] [,2]
#[1,] "0" "0"
#[2,] "scene2" "scene2"
#[[3]]
# [,1] [,2]
#[1,] "0" "0"
#[2,] "0" "scene3"
数据
通常情况下,如果您使用 dput
以可重现的形式添加数据会更好,这样我们就不必从头开始构造它。
df1 <- structure(list(name = c("name1", "name2", "name3"), scenario = c("scene1",
"scene2", "scene3"), Fire = list(structure(c(1, 1, 1, 0), .Dim = c(2L,
2L)), structure(c(0, 1, 0, 1),.Dim = c(2L, 2L)), structure(c(0,
0, 0, 1),.Dim = c(2L, 2L)))),row.names = c("1", "2", "3"),class = "data.frame")