【问题标题】:looping through each element in a list and add number to each item. using R循环遍历列表中的每个元素并为每个项目添加数字。使用 R
【发布时间】:2012-10-07 08:20:25
【问题描述】:

我读入一个文件,然后 R 返回一个列表,如下所示:
清单 1: "1)""Seo""agad""na""ciad""faclan""a"
清单 2:“cannteil”“(canntail)”“a-staigh”“dhan”“
清单 3:“2)”“Seo”“sinn”“sin”“direach”“fuirich…”

我想要的是得到一个向量,如果 [[i]] 中的第一个元素有一个数字,那么 [[i]] 中的其他元素也得到相同的数字,如果 [[ i]] 没有数字,那么 [[i]] 中的所有元素都将具有上一行中显示的数字,如下所示:

"1\t1)" "1\tSeo " "1\tagad " "1\tna " "1\tciad " "1\tfaclan " "1\ta " .... "2\t2)" "2\tseo", 2\tsinn....

谁能告诉我这个的代码?而且,有没有办法得到一个只包含每个单词对应的数字的向量,而不是在每个单词之前粘贴它?

谢谢

我的代码如下,但它没有给我想要的东西(所有元素都得到数字 1,即使是列表中以数字 2 开头的元素。) 代码哪一部分出错了?

word="" 
temp="" 
for (i in 1:length(file)) { 
       if (grepl('\\d+\)',file[[i]][1])) {       
       snum=grep('\\d+',file[[i]][1]) 
       temp=paste(snum, file[[i]], sep="\t") 
         } else { 
       temp=paste(snum,utter.short[[i]],sep="\t") 
         }   word=c(word,temp) 
     }

【问题讨论】:

  • 欢迎来到 Stack Overflow!请为我们提供可重现的示例stackoverflow.com/questions/5963269/…
  • “你能告诉我这个代码吗?”形式的问题。这里一般不回答。该站点最适合回答有关您已经在处理的特定问题的问题。正如@RomanLuštrik 所说,如果你有一个块显示你的尝试,你更有可能获得帮助。

标签: r loops


【解决方案1】:

假设您有一个列表列表,例如...

 list1 = list("1)" "Seo " "agad " "na " "ciad " "faclan " "a ")
 list2 = list("cannteil " "(canntail) " "a-staigh " "dhan ")
 list3 = list("2)" "Seo " "sinn, " "sin " "direach " "fuirich…")

 biglist = list(list1, list2, list3)

这是使用此设置的非优雅/非高效解决方案

 counter = 1
 for (i in 1:length(biglist){
 if (gsub("\\D", "", biglist[[i]][[1]])>0){
     counter = gsub("\\D", "", biglist[[i]][[1]]
     biglist[[i]] = biglist[[i]][2:length(biglist[[i]])]
     }
 lapply(counter, paste, biglist[[i]], sep="\t")
 }

这可以处理任意数量的行和行的长度,只要第一项有 1 个数字,并且这些行是一个接一个的。

根据它的用途,可能有更好的方法可以读取和存储数据。

【讨论】:

    【解决方案2】:

    更灵活,更容易理解(优雅?)。它以任意顺序处理数字,缺少第一项,并且易于更改/维护。

    # sample data
    list0a = list("cannteil " ,"(canntail) ", "a-staigh " ,"dhan ")
    list0b = list("cannteil " ,"(canntail) ", "a-staigh " ,"dhan ")
    list1 = list("3)","Seo ","agad ","na ", "ciad ", "faclan " ,"a ")
    list2 = list("cannteil " ,"(canntail) ", "a-staigh " ,"dhan ")
    list3 = list("2)", "Seo ", "sinn, ", "sin " ,"direach ", "fuirich…")
    
    # separate lists to test on
    biglist = list(list1,list2,list3)
    biglist2 = list(list0a,list0b,list1, list2, list3)
    
    # get number vector
    numlist <- sapply(biglist,function(x){
      as.numeric(gsub('[^0-9]','',x[1]))
    })
    
    # fill in gaps with indexing, drops leading items without numbers
    numorder <- cumsum(!is.na(numlist))
    numreplaced <- na.omit(numlist)[numorder]
    
    # handle missing first numbers however you want. omit if guaranteed first element has number
    numfinal <- c(rep('0',times = sum(numorder == 0)),numreplaced)
    
    # make the strings as desired
    Map(function(x,num){
      paste0(num,'\t',x)
    },x = biglist,num = numfinal)
    

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2012-01-04
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多