基本用法
- 与 data.frame 不同,rlist 适合于处理 非结构化数据,具体结构参考 R语言︱非结构化数据处理神器——rlist包
#此例子来自上述文章
#创建一个 rlist
devs <-
list(
p1=list(name="Ken",age=24,
interest=c("reading","music","movies"),
lang=list(r=2,csharp=4,python=3)),
p2=list(name="James",age=25,
interest=c("sports","music"),
lang=list(r=3,java=2,cpp=5)),
p3=list(name="Penny",age=24,
interest=c("movies","reading"),
lang=list(r=1,cpp=4,python=2)))
#查看rlist,用str比较简洁
str(devs)
#映射
list.map(devs,age)
list.map(devs, names(lang))
list.map(devs, mean(as.numeric(lang)))
#筛选
list.filter(dev,age>25)
与 data.table 的结合
#读入测试数据
test = read.csv("test.csv",stringsAsFactors = FALSE,header = T)
为什么要使用 rlist 和 data.table 结合
- 在这类型的数据中,ID,Sex, Age 之间是相对联系没那么紧密的,但是存在一些 Vars, Var1 和 Var2 和 Var3 之间是有关联的,每一个 Var1, Var2, Var3, 又分为 A, B两个部分。例如,Var123分别代表三餐的血糖,但每一餐的血糖测了餐前后餐后两个值(即A 和 B),在计算血糖波动的时候,通常要每一餐的餐后减去餐前,再取平均值,在记录天数很多的时候,用 rlist 就能减少工作量。又例如,Vars为一个检测的结果,VarA是检测日期,VarB是检测结果,总共测了1,2,3…N 次,如要分析检测结果的变化情况。
#将 data.frame 转换成 rlist
test_lst = lapply(1:nrow(test),function(i){
r = test[i,]
l = list()
l$ID = r$ID
l$Sex = r$Sex
l$Age = r$Age
l$Vars <- data.table(c(r$Var1_A,r$Var2_A,r$Var_3A),c(r$Var1_B,r$Var_2B,r$Var_3B))
colnames(l$Vars) = c("VarA","VarB")
l
})
- 转换后部分如图
#查看数据
test_lst[[1]]$ID
test_list[[1]]$Vars$VarA
Diff <-
lapply(test_lst,function(x){
dt <- x$Var
dif = mean(dt$VarB - dt$VarA)
})