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