R 通过匹配列名上每行的值来填充列值

R 通过匹配列名上每行的值来填充列值,r,R,我想创建如下数据框: Label Jim Charles Kevin Alan Charles 0 1 0 0 Kevin 0 0 1 0 Alan 0 0 0 1 Alan 0 0 0 1 Jim 1 0 0 0 我从一个数据框开始,在这个数据框中设置了列名,并在第一列中列出了人名,但所有数字都是0。我希望通过将第一列中列出的名称与列名相匹配

我想创建如下数据框:

Label   Jim Charles Kevin Alan
Charles 0   1       0     0  
Kevin   0   0       1     0
Alan    0   0       0     1
Alan    0   0       0     1
Jim     1   0       0     0

我从一个数据框开始,在这个数据框中设置了列名,并在第一列中列出了人名,但所有数字都是0。我希望通过将第一列中列出的名称与列名相匹配,能够快速将其中一些名称设置为1。

可能有一种更快的方法,但这应该可以很好地工作:

数据:


与Ben的回答类似,如果您的数据位于名为
df
的data.frame中:

df <- structure(list(Label = c("Charles", "Kevin", "Alan", "Alan", 
"Jim"), Jim = c(0, 0, 0, 0, 0), Charles = c(0, 0, 0, 0, 0), Kevin = c(0, 
0, 0, 0, 0), Alan = c(0, 0, 0, 0, 0)), .Names = c("Label", "Jim", 
"Charles", "Kevin", "Alan"), row.names = c(NA, -5L), class = "data.frame")

df[outer(df$Label, names(df), '==')] <- 1

df我认为这比我的答案更符合OP的数据结构(虽然数字矩阵可能是存储此类数据的更好/更有效的方法…它甚至可能希望是稀疏矩阵…)@BenBolker是的,但你很聪明!我不知道存储模式
mm <- outer(rownames(m),colnames(m),"==")
storage.mode(mm) <- "numeric" ## because as.numeric() loses matrix dimensions
dimnames(mm) <- dimnames(m)   ## reset row/column names
df <- structure(list(Label = c("Charles", "Kevin", "Alan", "Alan", 
"Jim"), Jim = c(0, 0, 0, 0, 0), Charles = c(0, 0, 0, 0, 0), Kevin = c(0, 
0, 0, 0, 0), Alan = c(0, 0, 0, 0, 0)), .Names = c("Label", "Jim", 
"Charles", "Kevin", "Alan"), row.names = c(NA, -5L), class = "data.frame")

df[outer(df$Label, names(df), '==')] <- 1