在执行了一些代码之后,我得到了这个列表
> test
$M
start end
[1,] 1 1
[2,] 2 2
$M
start end
[1,] 1 1
[2,] 2 2
$C
start end
[1,] 5 5它表示字符串中出现的字符(M,C)。然后,我将该列表传递给下面的Map()调用,以便为每个字符获取所有可能的组合。
ind1 = Map( function(x) lapply(1:nrow(test[[x]]), combn , x=test[[x]][,1]) , 1:length(test) )该代码的结果如下:
> ind1
[[1]]
[[1]][[1]]
[,1] [,2]
[1,] 1 2
[[1]][[2]]
[,1]
[1,] 1
[2,] 2
[[2]]
[[2]][[1]]
[,1] [,2]
[1,] 1 2
[[2]][[2]]
[,1]
[1,] 1
[2,] 2
[[3]]
[[3]][[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5换句话说,它正在执行以下操作
# For 1st item
combn(test[[1]][,] , 1 )
combn(test[[1]][,] , 2 )
# For 2nd item
combn(test[[2]][,] , 1 )
combn(test[[2]][,] , 2 )
# For 3rd item
combn(test[[3]][,] , 1 )所以问题在第三项。如您所见,字符串中只有一个字符"C“出现,这是第五个字符。
在这种情况下,对第三项的可能组合结果的预期如下所示
[[3]]
[[3]][[1]]
[,1]
[1,] 5而不是
[[3]]
[[3]][[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5这是因为我的代码中的combn()正在变成combn(5, 1 )。因此,我想知道是否有任何方法在Map()或lapply()中添加ifelse子句,以检查是否只有一次出现,以及是否允许它按现有方式执行,而不执行combn()部分。
谢谢。
发布于 2017-08-25 00:55:39
正如您已经认识到的,当combn(x, m)是长度为1的整数向量时,它对x的处理是不同的。
要解决这个问题,只需将向量转换为列表即可。ind1 = Map( function(x) lapply(1:nrow(test[[x]]), combn, x=as.list(test[[x]][,1])), 1:length(test) )
> ind1
[[1]]
[[1]][[1]]
[,1] [,2]
[1,] 1 2
[[1]][[2]]
[,1]
[1,] 1
[2,] 2
[[2]]
[[2]][[1]]
[,1] [,2]
[1,] 1 2
[[2]][[2]]
[,1]
[1,] 1
[2,] 2
[[3]]
[[3]][[1]]
[,1]
[1,] 5 而且,如果您这样写它,它可能会更清楚一些:
ind1 <- lapply(test, function(x) { lapply( seq_len(nrow(x)), function(m) combn(as.list(x[, 1]), m)) })
https://stackoverflow.com/questions/45868132
复制相似问题