首页 > 解决方案 > 如何在R中重构数据框

问题描述

例如,给定以下数据结构

v1 = c("DL1",    "", "DL3", "DL4",   "") 
v2 = c("DL1", "DL2", "DL3",    "","DL5") 
v3 = c("DL1", "DL2", "DL3",    "","DL5") 
v4 = c(   "",    "", "DL3",    "","DL5") 
v5 = c(   "",    "",    "",    "","DL5") 
data1 = rbind(v1,v2,v3,v4,v5)

我要生成

vt1 = c("DL1", "DL3", "DL4",    "","") 
vt2 = c("DL1", "DL2", "DL3", "DL5","") 
vt3 = c("DL1", "DL2", "DL3", "DL5","") 
vt4 = c("DL3",   "" ,    "",    "","") 
vt5 = c("DL5",   "" ,    "",    "","")  
data2 = rbind(vt1,vt2,vt3,vt4,vt5)

标签: r

解决方案


一个可能的解决方案是这样。

m <- data.frame(t(rbind(v1,v2,v3,v4,v5)), stringsAsFactors=FALSE)
mx <- t(sapply(m, function(x) {
  s <- x[x != ""]
  e <- 5 - length(s)
  return(c(s, rep("", e)))
}))

要获取行名:

rownames(mx) <- gsub("v", "vt", rownames(mx))

生产

> mx
    [,1]  [,2]  [,3]  [,4]  [,5]
vt1 "DL1" "DL3" "DL4" ""    ""  
vt2 "DL1" "DL2" "DL3" "DL5" ""  
vt3 "DL1" "DL2" "DL3" "DL5" ""  
vt4 "DL3" "DL5" ""    ""    ""  
vt5 "DL5" ""    ""    ""    "" 

推荐阅读