我有一个这样的调查数据集:
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]])]
答案 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"