gpt4 book ai didi

R 将列表转换为 Data.Frame 或 Table

转载 作者:行者123 更新时间:2023-12-03 20:25:58 24 4
gpt4 key购买 nike

list1 = list(
c(4,5,6,7,1,1,1,1,3,1,3,3),
c(3,4,5,6,2,2,2,2,1,4,2,1),
c(1,2,3,4,1,1,1,1,3,2,1,1),
c(5,6,7,8,1,1,1,1,4,4,4,3),
c(2,3,4,5,2,2,2,2,2,1,2,1)
)

data1=data.frame("ID"=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5),
"Time"=c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4),
"Grade"=c(4,5,6,7,3,4,5,6,1,2,3,4,5,6,7,8,2,3,4,5),
"Class"=c(1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2),
"Score"=c(3,1,3,3,1,4,2,1,3,2,1,1,4,4,4,3,2,1,2,1))

我有 'list1' 'list1' 中的每一项都等于一个人 4 年的成绩、类(class)、分数。
因此,“list1”有 5 个学生和每个学生的 12 条记录(三个变量中的每一个都有 4 条记录,Grade、Class 和 Score)。我希望将“list1”转换为“data1”,这是一个长数据文件,其中“ID”等于“list1”中的列表项编号。时间等于记录的时间(每个学生有 4 个时间度量),Grade 等于 list1 中所有元素的前 4 个数据点,对接下来的 4 个进行分类,并为最后 4 个评分。

示例输出显示为将“list1”转换为所需的输出“data1”。

这个数据集很大,所以我希望有一种有效的方法来进行这种转换。

最佳答案

我不确定它是否有效,但它很简洁:

setDT(list1)
# could also do something like paste0('student', 1:5) for clarity,
# and adjust patterns() below accordingly
setnames(list1, paste0(1:5))
# 4 = # of values of Time
list1[ , colid := rep(c('Grade', 'Class', 'Score'), each = 4L)]
# 3 = # of columns "stacked" in each student's column initially
list1[ , Time := rep(1:4, 3L)]
# first, reshape long
list1[ , melt(.SD, measure.vars = patterns('^[0-9]+'), variable.name = 'ID',
variable.factor = FALSE)
# now, reshape to the final format
][ , dcast(.SD, ID + Time ~ colid, value.var = 'value')]
# ID Time Class Grade Score
# <char> <int> <num> <num> <num>
# 1: 1 1 1 4 3
# 2: 1 2 1 5 1
# 3: 1 3 1 6 3
# 4: 1 4 1 7 3
# 5: 2 1 2 3 1
# 6: 2 2 2 4 4
# 7: 2 3 2 5 2
# 8: 2 4 2 6 1
# 9: 3 1 1 1 3
# 10: 3 2 1 2 2
# 11: 3 3 1 3 1
# 12: 3 4 1 4 1
# 13: 4 1 1 5 4
# 14: 4 2 1 6 4
# 15: 4 3 1 7 4
# 16: 4 4 1 8 3
# 17: 5 1 2 2 2
# 18: 5 2 2 3 1
# 19: 5 3 2 4 2
# 20: 5 4 2 5 1
# ID Time Class Grade Score

效率低下的原因是这里有两个操作。

先构建表骨架,然后填充它的方法可能会更快,如下所示:
# 4 = # of Times per ID&Column (assuming your table is rectangular)
out = CJ(ID = 1:length(list1), Time = 1:4)
# relies on ID being an integer, so that ID = 1 --> list1[[1]]
# gives ID=1's data
out[ , by = ID, c('Grade', 'Class', 'Score') := {
as.data.table(matrix(list1[[ .BY$ID ]], ncol = 3L))
}]

可能是 as.data.table效率也很低,但此代码比替代方法更具可读性:
out = CJ(ID = 1:length(list1), Time = 1:4)
out[ , by = ID, c('Grade', 'Class', 'Score') := {
student_data = list1[[.BY$ID]]
lapply(1:3, function(j) student_data[4L*(j-1) + 1:4])
}]

关于R 将列表转换为 Data.Frame 或 Table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61042733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com