循环遍历列表中的每个元素并为每个项添加数字。用R

时间:2012-10-07 08:20:26

标签: r loops

我在一个文件中读到并且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]] 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) 
     }

2 个答案:

答案 0 :(得分:3)

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

 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个数字,并且这些行是相互排序的。

根据具体情况,您可以更好地阅读和存储数据。

答案 1 :(得分:0)

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

# 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)