【问题标题】:Make a readable list of object or vector object from and nested list从嵌套列表中创建一个可读的对象或矢量对象列表
【发布时间】:2014-03-03 15:43:04
【问题描述】:

我创建了许多函数,我想将它们应用于列表的子列表(即嵌套列表)。

例如

# Getintervalduration
list.dur <- function(x){
  # x is a (non nested...) list
  dur <- x$xmax-x$xmin
  return(dur)
}

所以我可以将这个功能应用到:

(1) 我列表中的一个简单数据框

list.dur(intrad_02.textgrid$phones)

(2) 我列表中的所有数据框

 lapply(intrad_02.textgrid, list.dur)

(3)我的主列表中的所有嵌套列表和列表中的数据框

durations <- lapply(txtgridnames,list.dur)

第三个例子是我想自动成功的。

目前,txtgridnames 或多或少对应于names(list) 但我不得不半自动修改它,因为:

R 确实允许:

durations <- lapply(c(firstnestedlist, second.nested.list, etc.),list.dur)

但不幸的是不允许这样做:

 durations <- lapply(names(list.with.nested.lists.inside),list.dur)

names(list) 可能更改或希望在不同的研究案例中复制时,这是一个问题。

目前,我的解决方案(在这里思考)是编写一个名称不带“引号”并使用逗号作为 eol 的表,读取我刚刚使用名称创建的文件,然后手动创建一个对象所有的名字。

write.table(x=names(corpus),file="txtgridnames.txt", quote=FALSE, row.names=FALSE, append=FALSE, eol=",",col.names=FALSE)

txtgridnames <- readLines("txtgridnames.txt")

txtgridnames 

!手动复制输出!..并手动粘贴:

txtgridnames<-c(cnf_01_be,cnf_02_ch[...]) 

如何让R自动理解list(names(mainlist)),即如何自动创建这个对象“txtgridnames”?


这是我正在处理的数据结构的一个示例:(构成我的语料库的主列表中的 24 个子列表中的大约 502 个数据帧)

以前的帖子还更准确地描述了我正在处理的数据类型(要了解 xmin 和 xmax 对应的内容,请单击 here

#-------------------------------------------
## Data structure example 
$ cnf_01_be  :List of 17
  ..$ phones        :'data.frame':  2505 obs. of  3 variables:
  .. ..$ xmin : num [1:2505] 0 0.427 0.472 0.512 0.562 ...
  .. ..$ xmax : num [1:2505] 0.427 0.472 0.512 0.562 0.632 ...
  .. ..$ value: chr [1:2505] "_" "v" "w" "a" ...
  ..$ syll          :'data.frame':  1146 obs. of  3 variables:
  .. ..$ xmin : num [1:1146] 0 0.427 0.562 0.752 0.952 ...
  .. ..$ xmax : num [1:1146] 0.427 0.562 0.752 0.952 1.022 ...
  .. ..$ value: chr [1:1146] "_" "vwa" "la" "do~k" ...
  ..$ delivery      :'data.frame':  1146 obs. of  3 variables:
  .. ..$ xmin : num [1:1146] 0 0.427 0.562 0.752 0.952 ...
  .. ..$ xmax : num [1:1146] 0.427 0.562 0.752 0.952 1.022 ...
  .. ..$ value: chr [1:1146] "_" "" "" "" ...
  ..$ link          :'data.frame':  806 obs. of  3 variables:
  .. ..$ xmin : num [1:806] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:806] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:806] "_" "" "" "l" ...
  ..$ words         :'data.frame':  806 obs. of  3 variables:
  .. ..$ xmin : num [1:806] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:806] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:806] "_" "voilà" "donc" "vous" ...
  ..$ POS           :'data.frame':  806 obs. of  3 variables:
  .. ..$ xmin : num [1:806] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:806] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:806] "_" "VER:pres:entatif" "CON:coo" "PRO:sjt" ...
  ..$ discourse     :'data.frame':  750 obs. of  3 variables:
  .. ..$ xmin : num [1:750] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:750] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:750] "SIL:l" "MD" "CON" "" ...
  ..$ disfluency    :'data.frame':  806 obs. of  3 variables:
  .. ..$ xmin : num [1:806] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:806] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:806] "SIL:l" "" "" "" ...
  ..$ boundary-dismo:'data.frame':  750 obs. of  3 variables:
  .. ..$ xmin : num [1:750] 0 0.427 0.752 0.952 1.082 ...
  .. ..$ xmax : num [1:750] 0.427 0.752 0.952 1.082 1.256 ...
  .. ..$ value: chr [1:750] "MAJ" "MAJ" "MINg" "" ...
  ..$ speaker       :'data.frame':  1 obs. of  3 variables:
  .. ..$ xmin : num 0
  .. ..$ xmax : num 244
  .. ..$ value: chr "1"
  ..$ ortho         :'data.frame':  101 obs. of  3 variables:
  .. ..$ xmin : num [1:101] 0 0.427 3.571 4.3 7.659 ...
  .. ..$ xmax : num [1:101] 0.427 3.571 4.3 7.659 8.341 ...
  .. ..$ value: chr [1:101] "_" "voilà donc vous avez bien perçu même intuitivement qu'y avait euh" "_" "des choses issues de radios commerciales ou de radios classiques etcaetera" ...
  ..$ rection       :'data.frame':  117 obs. of  3 variables:
  .. ..$ xmin : num [1:117] 0 0.427 0.752 0.952 7.659 ...
  .. ..$ xmax : num [1:117] 0.427 0.752 0.952 7.659 8.341 ...
  .. ..$ value: chr [1:117] "" "md" "md" "urv" ...
  ..$ sequences     :'data.frame':  183 obs. of  3 variables:
  .. ..$ xmin : num [1:183] 0 0.427 0.752 0.952 1.942 ...
  .. ..$ xmax : num [1:183] 0.427 0.752 0.952 1.942 2.848 ...
  .. ..$ value: chr [1:183] "" "md" "md" "SV" ...
  ..$ boundary      :'data.frame':  0 obs. of  3 variables:
  .. ..$ xmin : num(0) 
  .. ..$ xmax : num(0) 
  .. ..$ value: chr(0) 
  ..$ contours      :'data.frame':  1143 obs. of  3 variables:
  .. ..$ xmin : num [1:1143] 0 0.427 0.562 0.752 0.952 ...
  .. ..$ xmax : num [1:1143] 0.427 0.562 0.752 0.952 1.022 ...
  .. ..$ value: chr [1:1143] "" "" "C" "" ...
  ..$ bdu-auto      :'data.frame':  53 obs. of  3 variables:
  .. ..$ xmin : num [1:53] 0 0.427 7.659 8.341 18.861 ...
  .. ..$ xmax : num [1:53] 0.427 7.659 8.341 18.861 19.624 ...
  .. ..$ value: chr [1:53] "" "bdu-1-c_C" "" "bdu-2-s_C" ...
  ..$ EPG           :'data.frame':  54 obs. of  3 variables:
  .. ..$ xmin : num [1:54] 0 0.427 0.952 8.341 8.806 ...
  .. ..$ xmax : num [1:54] 0.427 0.952 8.341 8.806 19.624 ...
  .. ..$ value: chr [1:54] "" "PGC-R" "" "PGC-R" ...
 $ cnf_02_ch  :List of 17
  ..$ phones        :'data.frame':  2304 obs. of  3 variables:
  .. ..$ xmin : num [1:2304] 0 0.001 0.219 0.866 0.886 ...
  .. ..$ xmax : num [1:2304] 0.001 0.219 0.866 0.886 0.944 ...
  .. ..$ value: chr [1:2304] "_" "n" "y" "m" ...
  ..$ syll          :'data.frame':  1080 obs. of  3 variables:
  .. ..$ xmin : num [1:1080] 0 0.001 0.866 1 1.089 ...
  .. ..$ xmax : num [1:1080] 0.001 0.866 1 1.089 1.239 ...
  .. ..$ value: chr [1:1080] "_" "na~" "m9~t" "" ...
  ..$ delivery      :'data.frame':  1080 obs. of  3 variables:
  .. ..$ xmin : num [1:1080] 0 0.001 0.866 1 1.089 ...
  .. ..$ xmax : num [1:1080] 0.001 0.866 1 1.089 1.239 ...
  .. ..$ value: chr [1:1080] "_" "" "" "" ...
  ..$ words         :'data.frame':  784 obs. of  3 variables:
  .. ..$ xmin : num [1:784] 0 0.219 0.866 1.089 1.239 ...
  .. ..$ xmax : num [1:784] 0.219 0.866 1.089 1.239 1.691 ...
  .. ..$ value: chr [1:784] "_" "humains" "maintenant" "la" ...
  ..$ link          :'data.frame':  784 obs. of  3 variables:
  .. ..$ xmin : num [1:784] 0 0.219 0.866 1.089 1.239 ...
  .. ..$ xmax : num [1:784] 0.219 0.866 1.089 1.239 1.691 ...
  .. ..$ value: chr [1:784] "_" "" "" "" ...
  ..$ POS           :'data.frame':  784 obs. of  3 variables:
  .. ..$ xmin : num [1:784] 0 0.219 0.866 1.089 1.239 ...
  .. ..$ xmax : num [1:784] 0.219 0.866 1.089 1.239 1.691 ...
  .. ..$ value: chr [1:784] "_" "ADJ:adj" "ADV:adv" "DET:def" ...
  ..$ disfluency    :'data.frame':  785 obs. of  3 variables:
  .. ..$ xmin : num [1:785] 0 0.219 0.866 1.089 1.239 ...
  .. ..$ xmax : num [1:785] 0.219 0.866 1.089 1.239 1.691 ...
  .. ..$ value: chr [1:785] "SIL:l" "" "" "CORR-B" ...
  ..$ discourse     :'data.frame':  728 obs. of  3 variables:
  .. ..$ xmin : num [1:728] 0 0.219 0.866 1.089 1.239 ...
  .. ..$ xmax : num [1:728] 0.219 0.866 1.089 1.239 1.691 ...
  .. ..$ value: chr [1:728] "SIL:l" "" "" "" ...
  ..$ boundary-dismo:'data.frame':  728 obs. of  3 variables:
[...]

提前致谢!

【问题讨论】:

  • 有什么原因,为什么不能使用嵌套的 lapply 调用? lapply(yourdata, function(x) lapply(x, list.dur))
  • 这是一个有用的回应 不。除了我可能很累而且我应该早点考虑这一点之外,没有理由不这样做.非常感谢。这样可以避免修改我的所有函数或重塑我的数据!)。

标签: r list nested praat


【解决方案1】:

假设您的列表结构有点规则,看起来是这样,您可以使用melt,然后使用任何标准的“split/apply/combine”样式工具(我们在这里使用data.table)。另外,我修改了我申请的函数为xmin-xmax 的总和,以便输出简洁明了:

library(data.table)  
library(reshape2)     # for `melt`
dt.mlt <- data.table(melt(my.list, id.vars=c("xmin", "xmax", "value")))
dt.mlt[, list(sum.duratin=sum(xmax - xmin)), by=list(L1, L2)]

产生:

          L1        L2 sum.duratin
 1: cnf_01ch    phones -1.36252011
 2: cnf_01ch     words  0.21568715
 3: cnf_01ch       POS -0.40070784
 4: cnf_01ch discourse -1.02992545
 5: cnf_01ch      link  1.50889336
 6: cnf_01be    phones -0.34931685
 7: cnf_01be     words -0.27385093
 8: cnf_01be       POS  0.70835139
 9: cnf_01be discourse  0.84285652
10: cnf_01be      link -2.76651670
11: cnf_01fr    phones  0.02533455
12: cnf_01fr     words  3.25470332
13: cnf_01fr       POS  0.97342401
14: cnf_01fr discourse -1.00580501
15: cnf_01fr      link -0.15233178

所以我已经对嵌套列表my.list 中的每个数据框应用了一个函数(或者在这种情况下,只是sum(xmax - xmin)),并将结果作为数据框输出,其中前两列指示哪个数据框统计来自。这是我使用的数据(两个深度嵌套列表):

col.names <- c("phones", "words", "POS", "discourse", "link")
my.list <- 
  setNames(
    replicate(
      3, 
      setNames(
        replicate(5, data.frame(xmin=runif(10), xmax=runif(10), value=runif(10)), s=F), 
        col.names
      ),
      s=F
    ),
    paste0(c("cnf_01"), c("ch", "be", "fr"))
  )

注意,这是我从 Joran to this question 的一个相当近期的回答中偷来的。

【讨论】:

    【解决方案2】:

    结论:如果你有嵌套列表,请嵌套 lapply ! _

    lapply(yourdata, function(x) lapply(x, list.dur))
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多