将向量的每个元素并行应用于相应的数据帧行

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")