跨越两个不同列表中的元素

时间:2018-01-23 08:58:05

标签: r list

我有两个这样的列表:

> output
[[1]]
   A   C freq
1 11 432    2
4 51 332    3

[[2]]
   A B   C freq
5 51 5 332    3

> k
[[1]]
[1] "A,C,freq"

[[2]]
[1] "A,B,C,freq"

第二个是第一个名字。

我想得到这个输出(由freq排序的字符向量):

> output2
[1] "A == 51 & B == 5 & C == 332 & freq == 3"
[2] "A == 51 & C == 332 & freq == 3"    
[3] "A == 11 & C == 432 & freq == 2"

我尝试了以下内容:

> for (j in 1:length(output)){
+   t[[j]]=as.character(paste("output[[j]]",noquote(k[[j]]),sep=","))
+   
+ }

> t
[1] "output[[j]],A,C,freq"
[2] "output[[j]],A,B,C,freq"

> tests <- function(data, ...){
+   colN <- c(...)
+   tmp <- get(data, envir = parent.frame())[colN]
+   Reduce(function(...) paste(..., sep=" & "),
+          Map(paste, names(tmp), tmp, MoreArgs = list(sep=" == ")))
+   
+ }

> output2=list()
> for (j in 1:length(t)){
+   output2[[j]] <- lapply(strsplit(t, ","), function(x) tests(x[1], 
+   x[-1]))}

我得到一个错误,因为最后一个循环无法识别t向量中的字符串。 如果我试试这个:

ll=output[[1]]
output3 <- c(sapply(strsplit("ll,A,C,freq", ","), function(x) tests(x[1], 
+ x[-1])))
> output3
[1] "A == 11 & C == 432 & freq == 2" 
[2] "A == 51 & C == 332 & freq == 3"

它运行良好(尽管它不是由freq排序的),但我可以有大的列表,这就是为什么我做了一个循环。

如果有人可以帮我解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西。 k如何进入图片?

如果我理解正确,您可以创建&#34;文字&#34;第一列,rbind all all by freq按降序排列如下:

outls <- lapply(output, function(x) {
    x$Text <- Reduce(function(...) paste(..., sep=" & "),
        Map(paste, names(x), x, MoreArgs = list(sep=" == ")))  
    x
})

out <- plyr::rbind.fill(outls)
out[order(-out$freq), "Text"]

数据:

output <- list(
    data.frame(A=c(11, 51), C=c(432, 332), freq=c(2,3)),
    data.frame(A=51, B=5, C=332, freq=3))