重塑调查数据集从广泛到长期

时间:2017-11-30 14:57:06

标签: r dplyr tidyr

我有一个这样的调查数据集:

df <- data.frame(
  employment = 0.45,
  income = 0.3,
  incomeFU1 = 0.4,
  married = 0.1,
  employmentFU1 = 0.7,
  employmentFU2 = 0.8,
  incomeFU2 = 0.8,
  smokingFU1 = 0.6,
  smokingFU3 = 0.1,
  ageFU3 = 0.9,
  marriedFU2 = 0.3
)

在这个数据集中,个人被问及他们的就业状况,收入等。 数据处于汇总水平,将其视为所有就业人员,平均收入等的比例。因此,数据集只有一行。

本调查中的个人在基线和3个随访时被询问。 基线变量没有结束字符串,后续答案的结尾如“FU1”,后续1等等。

我现在有了这些变量的第二个列表:

l <- list()
l[[1]] <- c("employment", "income", "married")
l[[2]] <- c("employmentFU1", "incomeFU1", "smokingFU1")
l[[3]] <- c("employmentFU2", "incomeFU2", "marriedFU2")
l[[4]] <- c("smokingFU3", "ageFU3")

第一个列表项有基线变量,第二个列表项有后续1个变量,第三个有后续跟2等。

请注意,有些变量可用于2或3次(有时甚至是所有)后续操作,有些只出现一次。

我现在想要将基于列表变量的数据帧重新整形为矩阵或数据框,如下所示:

employment      income         married              NA          NA
employmentFU1   incomeFU1           NA      smokingFU1          NA
employmentFU2   incomeFU2   marriedFU2              NA          NA
           NA          NA           NA      smokingFU3      ageFU3

此矩阵中的行数是列表元素的数量,在这种情况下为4。

我尝试过这样的事情,但没有走得太远:

m <- matrix()
m[1,1] <- df[, l[[1]][1]]
m[1,2] <- l[[2]][str_detect(l[[1]][1], l[[2]])]

1 个答案:

答案 0 :(得分:1)

这是我使用stringr尝试解决该问题的方法。可能存在更有效的东西

library(stringr)
table <- str_match(unlist(l), "(.*?)($|FU[0-9]+?)")
table[table==""] <- "FU0" ## "" is problematic

m <- matrix(NA, length(unique(table[,3])), length(unique(table[,2])))
colnames(m) <- unique(table[,2])
rownames(m) <- unique(table[,3])

foo <- apply(table, 1, function(row) m[row[3],row[2]] <<- row[1])

print(m)
#    employment      income      married      smoking      age
#FU0 "employment"    "income"    "married"    NA           NA
#FU1 "employmentFU1" "incomeFU1" NA           "smokingFU1" NA
#FU2 "employmentFU2" "incomeFU2" "marriedFU2" NA           NA
#FU3 NA              NA          NA           "smokingFU3" "ageFU3"