我正在尝试转换数据帧列表列表中的数据帧

问题描述 投票:0回答:1

我的数据如下:txt格式

Time ; Source ; Action
YYYY-MM-DD ; Card Biology ; Reading succesful 
YYYY-MM-DD ; Student 1 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Student 2 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Card Mathematics; Reading succesful 
YYYY-MM-DD ; Student 2 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Card Biology ; Reading succesful 
YYYY-MM-DD ; Student 1 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Card Biology ; Reading succesful 
YYYY-MM-DD ; Student 1 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Card History ; Reading succesful 
YYYY-MM-DD ; Student 1 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in
YYYY-MM-DD ; Card Biology ; Reading succesful 
YYYY-MM-DD ; Student 1 ; initialised 
YYYY-MM-DD ; Book 1 ; first check out
YYYY-MM-DD ; Book 2 ; Second check out
YYYY-MM-DD ; Book 3 ; check in

每当该列“操作”包含:“读取成功”时,我想首先将这些数据拆分到卡片列表中

当 Action 列包含“initialized”时,我想进行列表测试并将其元素拆分到子列表中

理想情况下,我想将相应的学生分配到列表中,但这并不是非常重要。

我首先用 test<- split(i, cumsum(test$

b
$Text == "阅读成功")) 拆分列表。

我用

指定列表的名称
for (a in test) {
  names(test)<-sapply(test, `[[`, 1,2)
}

我尝试过循环遍历列表元素,但未能使其工作。

我想要以下数据配置

test$
[[card xxx]]$
[[Student 1]], [[Strudent 2]], etc

[[card yyy]]
[[Student 1]], [[Strudent 2]], etc

每个学生应该是一个包含书籍列表的矩阵,最好是卡片类型及其本身的时间和行动的副本

r xml dataframe list transform
1个回答
0
投票

一种方法可能是先获取名称,将它们保存为变量

library(dplyr)

df_nms <- df %>% 
  mutate(grp = cumsum(Action == "Reading succesful")) %>% 
  mutate(grp2 = cumsum(Action == "initialised"), 
         grp = paste(Source[1],grp), .by = grp) %>% 
  filter(grp2 != 0) %>% 
  mutate(grp2 = paste(Source[1]), .by = c(grp, grp2)) %>% 
  filter(Action != "initialised")

然后根据这些进行拆分

lapply(split(df_nms, df_nms$grp), \(x) {
  res <- split(x, x$grp2); lapply(res, \(y) y[,1:3])})

输出

$`Card Biology 1`
$`Card Biology 1`$`Student 1`
        Time Source           Action
1 YYYY-MM-DD Book 1  first check out
2 YYYY-MM-DD Book 2 Second check out
3 YYYY-MM-DD Book 3         check in

$`Card Biology 1`$`Student 2`
        Time Source           Action
4 YYYY-MM-DD Book 1  first check out
5 YYYY-MM-DD Book 2 Second check out
6 YYYY-MM-DD Book 3         check in


$`Card Biology 3`
$`Card Biology 3`$`Student 1`
         Time Source           Action
10 YYYY-MM-DD Book 1  first check out
11 YYYY-MM-DD Book 2 Second check out
12 YYYY-MM-DD Book 3         check in
...

数据

df <- structure(list(Time = c("YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", 
"YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD", "YYYY-MM-DD"), Source = c("Card Biology", 
"Student 1", "Book 1", "Book 2", "Book 3", "Student 2", "Book 1", 
"Book 2", "Book 3", "Card Mathematics", "Student 2", "Book 1", 
"Book 2", "Book 3", "Card Biology", "Student 1", "Book 1", "Book 2", 
"Book 3", "Card Biology", "Student 1", "Book 1", "Book 2", "Book 3", 
"Card History", "Student 1", "Book 1", "Book 2", "Book 3", "Book 1", 
"Book 2", "Book 3", "Card Biology", "Student 1", "Book 1", "Book 2", 
"Book 3"), Action = c("Reading succesful", "initialised", "first check out", 
"Second check out", "check in", "initialised", "first check out", 
"Second check out", "check in", "Reading succesful", "initialised", 
"first check out", "Second check out", "check in", "Reading succesful", 
"initialised", "first check out", "Second check out", "check in", 
"Reading succesful", "initialised", "first check out", "Second check out", 
"check in", "Reading succesful", "initialised", "first check out", 
"Second check out", "check in", "first check out", "Second check out", 
"check in", "Reading succesful", "initialised", "first check out", 
"Second check out", "check in")), row.names = c(NA, -37L), class = "data.frame")
© www.soinside.com 2019 - 2024. All rights reserved.